Je veux prouver ou infirmer l'existence d'un algorithme qui, étant donné un tableau d'entiers, trouve trois indices i , j et k tels que i < j < k et A [ i ] < A [ j ] < A [ k ] (ou constate qu'il n'y a pas un tel triple) en temps linéaire.
Ce n'est pas une question de devoirs; Je l'ai vu sur un forum de programmation conçu comme «essayez d'implémenter un tel algorithme». Je soupçonne que c'est impossible après diverses expériences. Mon intuition me le dit, mais cela ne compte vraiment pour rien.
Je voudrais le prouver formellement. Comment faites-vous? J'aimerais idéalement voir une preuve présentée étape par étape, puis si vous êtes si enclin, une explication sur la façon de prouver / réfuter des questions simples comme celle-ci en général. Si cela peut vous aider, quelques exemples:
[1,5,2,0,3] → (1,2,3)
[5,6,1,2,3] → (1,2,3)
[1,5,2,3] → (1,2,3)
[5,6,1,2,7] → (1,2,7)
[5,6,1,2,7,8] → (1,2,7)
[1,2,999,3] → (1,2,999)
[999,1,2,3] → (1,2,3)
[11,12,8,9,5,6,3,4,1,2,3] → (1,2,3)
[1,5,2,0,-5,-2,-1] → (-5,-2,-1)
J'ai supposé que l'on pouvait itérer sur , et chaque fois qu'il y a un i < j (notre j actuel , c'est-à-dire), nous faisons un nouveau triple et le poussons sur un tableau. Nous continuons à avancer et à comparer chaque triple jusqu'à ce que l'un de nos triplets soit complet. Il est donc comme , ! Mais je pense que c'est plus complexe que le simple O ( n ) car le nombre de triplets sur notre triple tableau correspondrait dans le pire des cas à la taille de la liste d'entrée.[1,5,2,0,-5,-2,-1] → 1..2.. -5.. -2.. -1
[1,5,2,0,-5,-2,3,-1] → 1..2.. -5.. -2.. 3