DCTLib ha ragione, ma dimentica la matematica per un secondo.
Quindi, secondo la tua logica, n -ary dovrebbe essere il più veloce. Ma se ci pensate, n -ary è esattamente uguale a una normale ricerca di iterazioni (iterando semplicemente la lista 1 per 1, ma in ordine inverso). Innanzitutto seleziona l'ultimo (o il prossimo all'ultimo) elemento nell'elenco e confronta quel valore con il tuo valore di confronto. Quindi rimuovi quell'elemento dal tuo elenco e quindi scegli l'ultimo elemento nel nuovo elenco, che è solo l'ultimo all'ultimo valore dell'array. Ogni volta, elimineresti solo 1 valore alla volta fino a quando non avrai trovato il tuo valore.
Invece, dovresti pensarci in questo modo - come posso eliminare la maggior parte dei valori dall'elenco ogni iterazione? In una ricerca binaria, elimini sempre metà dell'elenco. In una ricerca ternaria, esiste la possibilità (33,33% di probabilità, in realtà) che è possibile eliminare i 2/3 dell'elenco, ma esiste una possibilità ancora maggiore (66,66%) di eliminare solo 1/3 dell'elenco. per calcolare O (n), devi guardare lo scenario peggiore, che è 1/3, meno di 1/2. Man mano che ti avvicini sempre di più a n, diventa anche peggio.
Non solo lo scenario peggiore sarà migliorato con la ricerca binaria, ma migliorerà anche il tempo medio . Guardando il valore atteso (quale parte dell'elenco possiamo rimuovere in media), utilizziamo questa formula:
(P_lower) x (porzione che possiamo rimuovere se inferiore) + (P_higher) x (porzione che possiamo rimuovere se superiore) = E
Per la ricerca binaria, questo è .5x.5 + .5x.5 = .5 (rimuoviamo sempre metà dell'elenco). Per le ricerche ternarie, questo valore è .666x.333 + .333x.666 = 0.44, o ad ogni passo, probabilmente rimuoveremo solo il 44% dell'elenco, rendendolo in media meno efficiente della ricerca binaria. Questo valore raggiunge un picco di 1/2 (metà dell'elenco) e diminuisce con l'avvicinarsi di n (iterazione inversa) e 0 (iterazione regolare).
Ok, quindi ho mentito ... c'è un po 'di matematica in gioco, ma spero che ti aiuti!