У меня возникли проблемы с определением того, что вы подразумеваете под "троичным поиском". Причина, по которой двоичный поиск разбивает массив на две половины, состоит в том, что при каждом сравнении, которое вы выполняете, массив разбивается на две области: элементы меньше, чем рассматриваемый элемент, и элементы больше, чем рассматриваемый элемент. Я не вижу простого способа обобщить это так, чтобы вы разбили массив на три части, выполнив одно сравнение.
Однако, если вы не разбиваете массив на равные половины и вместо этого разбиваете его на 1 / 3 / 2 / 3 разделите на каждую итерацию, тогда вы все равно получите производительность O (lg n), хотя постоянный член будет выше. На самом деле, для любой постоянной & epsilon; в котором вы разбиваете массив на доли размера & epsilon; / 1- & epsilon; кусочки, вы получите O (LG N) поведение.
Если при выполнении сравнения вы разбили массив на две части размером & epsilon; n и (1- & epsilon;) n, завершив работу только тогда, когда размер массива станет меньше единицы, то алгоритм завершится после k шагов, где k - наименьшее целое число, для которого & epsilon; k n <1 и для которого (1- & epsilon;) <sup>k n <1. Переставляя, получаем </p>
& epsilon; k n <1 </p>
& epsilon; k <1 / n </p>
k> log & epsilon; 1 / n
k> - log & epsilon; n
k> - lg н / lg & epsilon;
k> lg н / lg 1 / & epsilon;
Используя аналогичную логику, но с 1 - & epsilon ;, мы получаем, что
k> lg н / lg 1 / (1 - & epsilon;)
Обратите внимание, что поскольку lg 1 / & epsilon; и lg 1 / (1 - & epsilon;) являются константами, наименьшая k, удовлетворяющий этим свойствам, равен O (lg n).