Если вы загружаете словарь в HashMap, вы можете протестировать каждую подстроку кандидата («wunderground», «underground», «nderground», «derground», ..., «wundergroun», ..., «under ", ..." ground ", ...) очень быстро, в частности, в O (1) раз.
Для оценки эффективности: Выясните, сколько шагов ему нужно сделать. Мы оценим его большую сложность O.
Ваш текущий алгоритм должен прокручивать весь словарь: работа пропорциональна размеру словаря, записи D). Для каждого словаря слово вызывает : работа пропорциональна размеру URL-слова, символам C, минус средний размер словарного слова, который мы будем называть 5. Таким образом, он принимает порядок D * (C - 5) шаги, O (D * (C - 5)), для каждого слова в URL.
После создания хеш-таблицы стоимость поиска не зависит от количества записей. Каждый URL-адрес символов C имеет C подстроки. Если вы обрезаете его подстроками не менее 5 символов, это (C - 5) подстроки. [Ну, технически это (C - 5) * (C - 4)/2, но мы вычисляем асимптотическую сложность, что является приближением большой картины.] Таким образом, стоимость поиска их всех в словаре - это (C - 5) шаги. Опять же, это для каждого слова в URL-адресе и независимо от размера словаря.
Скажем, ваш словарь содержит 10 000 записей, а средний URL-адрес - 10 символов. Затем старый алгоритм принимает 50 000 шагов на URL-адрес, а алгоритм hash принимает 25 шагов на URL-адрес. Имеют смысл?
Но иногда слово встроено в строку типа «земля» в «wunderground». Я не могу заранее индексировать «wunderground». – user436390
Во время выполнения вам просто нужно разделить термин «wunderground» на все его слова-кандидаты (подстроки) и проверить каждого кандидата, чтобы увидеть, находится ли он в HashMap. Список кандидатов не будет длинным (предполагая, что условия коротки, как «wunderground»), и каждый тест будет быстрым. – Jerry101
Хорошо, спасибо. Это может быть быстрее, чем цикл через весь словарь для каждого токена. – user436390