Выполняя второе кодовое ката (которое просит вас реализовать алгоритм двоичного поиска пять раз, каждый раз с другим методом), я придумал немного другое решение, которое работает следующим образом:
Если у меня есть отсортированный массив длины 100, и я вижу, что его начальное поле содержит число 200, а его конечное поле содержит число 400, я, как математик, изучающий человека, мог бы начать поиск вокруг поля 35, если бы я искал число 270, а не поле 50, как в обычном алгоритме двоичного поиска.
Затем, если число в поле 35 массива равно 270, 35 - это индекс, который я искал.
Если это не так, я могу сравнить полученное число (скажем, 280) и повторить операцию, взяв нижнюю часть массива (таким образом, у меня есть 35 полей с начальным полем, содержащим 200, и конечным полем, содержащим 280), если число, которое я нашел, больше, чем то, что я ищу, или верхней части массива (скажем, я получил 260: теперь у меня есть 65 индексов, первый из которых содержит 260, а последний - 400. Ориентировочно, я бы направился к вершине индекс 4 этого подмассива, который является индексом 39 всего массива), если число, которое я получил, меньше числа, которое я ищу.
Вопрос: можно ли считать этот алгоритм алгоритмом двоичного поиска? Если нет, есть ли у него свое имя?
источник
Ответы:
Я бы не назвал это бинарным поиском.
Он явно похож на бинарный поиск и естественно рассматривать его как уточнение бинарного поиска. Однако он имеет существенно отличающиеся характеристики сложности алгоритма. Для интерполяционного поиска ожидаемое время выполнения O (log (log (n))) при условии, что данные распределены равномерно, однако он платит за это наличием O (n) времени выполнения в худшем случае.
Я предпочитаю говорить «Время выполнения двоичного поиска в худшем случае - O (log (n))», а не «В зависимости от выбора ограничивающих элементов время выполнения двоичного поиска в худшем случае - O (log (n))». Это означает, что я не могу классифицировать интерполяционный поиск как алгоритм двоичного поиска.
источник
Да, это называется интерполяционным поиском . С некоторыми оговорками (в зависимости от вашей вычислительной модели и распределения данных) его ожидаемое время выполнения , лучше, чем бинарный поиск.O(loglogn)
источник
Я думаю, что правильной терминологией будет поиск в дихотомии.
Вы ищете в плоском массиве с последующим обдуманным поиском на основе предполагаемого плоского распределения чисел в нем.
Это соответствует тому, как человек будет искать слово в словаре. Но это может быть очень неэффективно, если распределение данных нерегулярно.
источник