DCTLib правильно, але забудьте математику на секунду.
За вашою логікою, n -ary повинен бути найшвидшим. Але якщо ви задумаєтесь, n -ary точно дорівнює звичайному пошуку ітерації (просто повторення через список 1 на 1, але у зворотному порядку). Спочатку вибираєте останній (або поруч з останнім) елемент у списку і порівнюєте це значення зі значенням порівняння. Потім ви вилучаєте цей елемент зі свого списку, а потім вибираєте останній елемент у новому списку, який є лише наступним за останнім значенням у масиві. Кожного разу ви будете вилучати лише одне значення за один раз, поки не знайдете своє значення.
Натомість вам слід думати про це так - як я вилучаю найбільші значення зі списку кожної ітерації? Під час двійкового пошуку ви завжди виключаєте половину списку. Під час потрійного пошуку існує ймовірність (33,33% шансу, насправді) ви зможете усунути 2/3 списку, але є ще більший шанс (66,66%), що ви вилучите лише 1/3 списку. для того, щоб обчислити O (n), потрібно подивитися на найгірший сценарій, який становить 1/3, менше 1/2. По мірі наближення і наближення до n вона стає ще гіршою.
Не тільки найгірший сценарій буде покращений за допомогою двійкового пошуку, але і ваш середній час буде покращений. Дивлячись на очікуване значення (яку частину списку ми можемо видалити в середньому), ми використовуємо цю формулу:
(P_lower) x (частина, яку ми можемо видалити, якщо нижня) + (P_higher) x (частина, яку ми можемо видалити, якщо вище) = E
Для двійкового пошуку це .5x.5 + .5x.5 = .5 (ми завжди видаляємо половину списку). Для потрійних пошуків це значення становить .666x.333 + .333x.666 = 0.44, або на кожному кроці ми, ймовірно, в середньому видалимо лише 44% списку, що робить його менш ефективним, ніж двійковий пошук. Це значення досягає максимальної позначки 1/2 (половина списку) і зменшується ближче до досягнення n (зворотна ітерація) та 0 (регулярна ітерація).
Гаразд, так я збрехав ... тут мало математики, але я сподіваюся, що це допомагає!