Поиск интерполяция строк

для тех из вас, кто не знаком с интерполяционным поиском, это метод поиска значения в отсортированном массиве, который потенциально быстрее, чем двоичный поиск. Вы смотрите на первый и последний элемент и (предполагая, что содержимое массива равномерно распределено) линейно интерполируете для прогнозирования местоположения.

например: у нас есть массив длины 100 с массивом[0]=0 и массивом[99]=99. Если мы ищем 80, интуитивно понятно попробовать array[80] над array[50], и если массив близок к равномерно распределенному, ожидаемая среда выполнения уменьшается до log(log(N))

для чисел местоположение для проверки определяется уравнением: low + ((toFind - sortedArray[low]) * (high - low + 1)) / (sortedArray[high] - sortedArray[low]).

общий пример, используемый для демонстрации интуитивной природы интерполяционного поиска: представьте, что вы пытаетесь найти слово "желтый" в словаре. Вы не будете использовать двоичный поиск и идти на половину пути. Скорее, вы отправитесь в ожидаемое место.

люди могут естественно линейно интерполируйте строки, но я не могу понять, как это кодировать. Как мы линейно интерполируем строки?

1 ответов


чтобы найти "расстояние" между двумя строками, простым методом было бы посмотреть на первую букву, которая отличается между ними, и присвоить каждому числовое значение, а затем взять разницу.

например, расстояние от "a" до "y" будет 24, а расстояние от "y" до " z " будет 1, Если каждой букве будет присвоено значение, равное ее положению в алфавите.

лучший метод выполнения будет проходить через словарь для взвешивания различных букв как часто они встречаются в реальных словах.

другим уточнением было бы посмотреть на два символа - "aa "дальше от" bz", чем" az "от" ba", например. Выход за рамки двух персонажей мало что даст.

причина, по которой этот метод не более популярен, заключается в том, что он усложняет алгоритм бинарного поиска для не большого выигрыша. Если бы Вы были вовремя, вы могли бы даже обнаружить, что стандартный двоичный поиск быстрее; то, что вы получаете в меньшем количестве сравнений, вы теряете в сложность определения расстояний.

также обратите внимание, что наихудшая производительность этого алгоритма хуже, чем двоичный поиск. Рассмотрим, например, поиск " ae "в списке"aa","ab","ac","ad","ae"," zz "- выброс" zz " будет смещать поиск так, что он всегда пытается начать диапазон поиска. В этих условиях он деградирует до O(n).