Вот другой способ думать о том, что вы делаете. Вместо того, чтобы думать о бинарном поиске как о поиске по элементам массива, думайте о бинарном поиске как о поиске по разделителям между элементами в массиве . В частности, представьте нумерацию массива следующим образом:
+-----+-----+-----+-----+-----+
| 0 | 1 | 2 | ... | n-1 |
+-----+-----+-----+-----+-----+
Теперь нумеруйте разделители:
+-----+-----+-----+-----+-----+
| 0 | 1 | 2 | ... | n-1 |
+-----+-----+-----+-----+-----+
0 1 2 3 .. n-1 n
Обратите внимание, что существует n + 1 разделителей, один перед каждым элементом и один после самый последний элемент.
Всякий раз, когда вы выполняете двоичный поиск, вы проверяете индекс среднего разделителя (вы понимаете, почему?) и выбрасываете половину разделителей. Вы можете выбросить только половину коллекции из k предметов из журнала 2 k раз , прежде чем перейти к одному оставшемуся элементу. Это означает, что количество необходимых зондов будет ⌈log 2 (n + 1) ⌉, и это случай, когда
log 2 n <⌈log <sub>2 (n + 1) log ≤ log 2 n + 1,
, поэтому бит "1 + log n" заканчивается вверх, возникающих из-за «выбросить половину разделителей», чем из других источников.
Надеюсь, это поможет!