DCTLib haklı, ama bir saniye için matematiği unut.
O zaman mantığınızla, n -ary en hızlı olmalı. Ancak, eğer bunu düşünürseniz, n -ary normal bir yineleme aramasına tamamen eşittir (sadece listeyi 1'e 1 yineleyen, ancak ters sırada). Öncelikle listedeki son (veya sondan sonraki) öğeyi seçip bu değeri karşılaştırma değerinizle karşılaştırın. Sonra o öğeyi listenizden kaldırırsınız ve yeni listedeki son öğeyi seçersiniz; bu, dizideki son değerin hemen yanındadır. Her seferinde, değerinizi bulana kadar bir seferde yalnızca 1 değeri elemediniz.
Bunun yerine, böyle düşünmelisin - her yinelemede listedeki en fazla değeri nasıl eleyebilirim? İkili bir aramada, listenin yarısını her zaman kaldırırsınız. Üçlü bir aramada, listenin 2 / 3'ünü elimine etme olasılığınız (aslında% 33,33 şansı), ancak listenin sadece 1 / 3'ünü elimine alma şansınız daha da yüksektir (% 66,66). O (n) 'yi hesaplamak için, 1/3 olan 1/2 en küçük senaryoya bakmanız gerekir. N'ye yaklaştıkça, daha da kötüye gider.
İkili arama ile yalnızca en kötü durum senaryosu iyileştirilmeyecek, aynı zamanda ortalama süreniz de artacaktır. Beklenen değere bakarak (listenin hangi kısmını ortalama olarak kaldırabiliriz), şu formülü kullanırız:
(P_lower) x (daha düşükse çıkarabileceğimiz kısım) + (P_higher) x (daha yüksekse çıkarabileceğimiz kısım) = E
İkili arama için, bu .5x.5 + .5x.5 = .5'tir (listenin yarısını daima kaldırırız). Üçlü aramalar için bu değer .666x.333 + .333x.666 = 0.44 veya her adımda, listenin yalnızca% 44'ünü kaldıracağız, bu sayede ikili aramadan ortalama olarak daha az verimli hale getireceğiz. Bu değer 1/2 olarak (listenin yarısı) doruk noktasına çıkar ve n (ters yineleme) ve 0 (normal yineleme) değerlerine yaklaştıkça düşer.
Tamam, yalan söyledim ... biraz matematik işin içinde, ama umarım bu yardımcı olur!