Поиск массив элементов с помощью бинарного поиска дублей, в худшем случае журнал 2 N итераций , потому что на каждом шаге мы подрезать половину нашего пространства поиска. Если бы вместо этого мы использовали «троичный поиск», мы бы вырезали две трети пространства поиска на каждой итерации, поэтому в худшем случае должно быть log 3 N < log 2 N итераций ...
Кажется, что троичный поиск быстрее, так почему мы используем бинарный поиск?
algorithms
algorithm-analysis
runtime-analysis
search-algorithms
binary-search
Средняя площадь
источник
источник
Ответы:
источник
DCTLib прав, но на секунду забудем математику.
По твоей логике, n- трей должен быть самым быстрым. Но если подумать, n -ary в точности равен обычному итерационному поиску (просто перебирает список 1 на 1, но в обратном порядке). Сначала вы выбираете последний (или рядом с последним) элемент в списке и сравниваете это значение со значением сравнения. Затем вы удаляете этот элемент из своего списка, а затем выбираете последний элемент в новом списке, который находится рядом с последним значением в массиве. Каждый раз вы будете удалять только 1 значение за раз, пока не найдете свое значение.
Вместо этого вы должны думать об этом так: как мне исключить большинство значений из списка на каждой итерации? В бинарном поиске вы всегда исключаете половину списка. При троичном поиске есть вероятность (на самом деле 33,33%), что вы можете удалить 2/3 списка, но есть еще больший шанс (66,66%), что вы удалите только 1/3 списка. чтобы рассчитать O (n), вам нужно взглянуть на сценарий наихудшего случая, который равен 1/3, меньше 1/2. По мере того, как вы все ближе и ближе, становится еще хуже.
С помощью бинарного поиска улучшится не только сценарий наихудшего случая, но и ваше среднее время. Глядя на ожидаемое значение (какую часть списка мы можем удалить в среднем), мы используем следующую формулу:
(P_lower) x (часть, которую мы можем удалить, если она ниже) + (P_higher) x (часть, которую мы можем удалить, если она выше) = E
Для бинарного поиска это .5x.5 + .5x.5 = .5 (мы всегда удаляем половину списка). Для троичных поисков это значение равно .666x.333 + .333x.666 = 0.44, или на каждом шаге мы, вероятно, удалим только 44% списка, что делает его в среднем менее эффективным, чем бинарный поиск. Это значение достигает пика 1/2 (половина списка) и уменьшается по мере приближения к n (обратная итерация) и 0 (обычная итерация).
Ладно, я солгала ... тут немного математики, но я надеюсь, что это поможет!
источник
Обратите внимание, что аргумент сравнения log (N) и 2 log (N) основан на наивной интерпретации алгоритма. Если бы мне пришлось сесть и написать это в сборке x86, результаты были бы инвертированы. Проблема заключается в использовании целых чисел для тестовых случаев в сочетании с недостаточно умным компилятором, который не может удалить избыточные сравнения. Повторите попытку, используя строки и соответствующую функцию сравнения строк, и закодируйте ее, чтобы вызывать функцию сравнения один раз за цикл, и вы обнаружите, что троичный поиск снова выполняется быстрее.
источник