Voglio provare o confutare l'esistenza di un algoritmo che, dato un array di numeri interi, trova tre indici e tali che e (o scopre che non esiste tale triplo) in tempo lineare.i , j k i < j < k A [ i ] < A [ j ] < A [ k ]
Questa non è una domanda a casa; L'ho visto su un forum di programmazione incorniciato come "provare a implementare un tale algoritmo". Sospetto che sia impossibile dopo vari esperimenti. La mia intuizione me lo dice, ma non conta davvero nulla.
Vorrei dimostrarlo formalmente. Come si fa? Idealmente, vorrei vedere una dimostrazione dettagliata passo dopo passo, e poi, se sei così propenso, alcune spiegazioni su come procedere per dimostrare / smentire semplici domande come questa in generale. Se aiuta, alcuni esempi:
[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)
Supponevo che si potesse iterare su , e ogni volta che c'è un (il nostro attuale , cioè), facciamo un nuovo triplo e lo inseriamo in un array. Continuiamo a fare un passo e confrontare ogni tripla fino a quando una delle nostre triple è completa. Così è come , ! Ma penso che questo sia più complesso del semplice poiché il numero di triple sul nostro array triplo corrisponderebbe nel peggiore dei casi alla dimensione della lista di input.i < j j O ( n )[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