Для тех из вас, кто не знаком с поиском интерполяции, это метод поиска значения в отсортированном массиве, который потенциально быстрее, чем двоичный поиск. Вы смотрите на первый и последний элемент и (при условии, что содержимое массива равномерно распределено), линейно интерполировать, чтобы предсказать местоположение.Поиск по интерполяции по строкам
Например: у нас есть массив длиной 100 с массивом [0] = 0 и array [99] = 99. Если мы ищем 80, интуитивно попробуйте массив [80] по массиву [50], и если массив близок к равномерно распределенному, ожидаемое время работы сводится к log(log(N))
Для номеров, местоположение для проверки определяется уравнением: low + ((toFind - sortedArray[low]) * (high - low + 1))/(sortedArray[high] - sortedArray[low])
.
Обычный пример, используемый для демонстрации интуитивной природы интерполяционного поиска: представьте, что вы пытаетесь найти слово «желтый» в словаре. Вы не использовали бы двоичный поиск и переходите на половину пути. Скорее, вы отправитесь в ожидаемое место.
Люди могут естественно линейно интерполировать строки, но я не могу понять, как это сделать. Как мы линейно интерполируем строки?
Хорошие точки со всех сторон. +1 –
Дополнительная сложность - 2 мульти/div + 5 add/sub. Я тестировал его и, да, он немного медленнее, чем двоичный поиск (если N не смешно). Но если сравнение нетривиально (как и в случае с строками), то это может стоить. – user108088
@ user108088, сложность также заключается в вычислениях расстояний, которые также будут нетривиальны в случае строк. См. Мое редактирование. –