Алгоритм, используемый браузером для поиска слов на веб-странице - PullRequest
5 голосов
/ 10 марта 2010

Какая структура данных или алгоритм используется в браузерах для поиска слова? Будут ли браузеры создавать дерево три или суффиксов?

Спасибо
Bala

Ответы [ 4 ]

3 голосов
/ 10 марта 2010

Поиск по дереву Trie / Suffix выполняется быстро, но создание Trie для начала значительно медленнее. Это означает, что они имеют смысл только тогда, когда вы ожидаете, что выполнит большое количество поисков по одним и тем же данным, поэтому вы можете амортизировать время для построения поиска по многим поискам.

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

Это означает, что линейный поиск почти всегда будет существенно более эффективным в целом, чем дерево три или суффиксов. Я предполагаю, что, если они потрудятся оптимизировать его за пределы простого вызова strstr(), они зайдут так далеко, как что-то в семействе строкового поиска Бойера-Мура. Учитывая количество поисковых запросов, которые вы ожидаете на веб-странице, это обычно завершит их все, прежде чем вы сможете просто выполнить первоначальную сборку дерева, поэтому вы можете начать поиск с ним.

Для интерактивного использования ваша главная задача - получать результаты достаточно быстро, чтобы они появлялись мгновенно. Как правило, это означает, что результаты в течение 100 мс или около того. При хорошей реализации Boyer-Moore-Horspool у вас будет достаточно времени для поиска объема текста, который будет безумным для включения в одну веб-страницу (порядка сотен мегабайт или гигабайт).

Если вы хотите проверить это, я бы порекомендовал Рею Гарднеру реализацию Бойера-Мура-Хорспула (Bmhsrch.C, с сайта Snippets Боба Стаута). Я действительно ненавижу , чтобы видеть веб-страницу достаточно большой, чтобы она оставалась занятой даже в течение 20 мс, не говоря уже о 100 (хотя я первый, кто признал, что эта конкретная реализация исключительно быстра).

3 голосов
/ 10 марта 2010

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

Кроме того, поиск может выполняться постепенно. Скажем, я ищу "алгоритм". Когда я набираю «а», браузер может находить (или асинхронно начинать поиск) вхождения буквы «а», а последующие символы только уточняют текущие результаты.

3 голосов
/ 10 марта 2010

Веб-страницы обычно недостаточно велики, чтобы требовать сложных алгоритмов поиска, по крайней мере, при первом сканировании. Я имею в виду, что вы можете найти любое слово с помощью простого линейного поиска всего за несколько мс. Оптимизация может состоять в том, чтобы построить три во время первого сканирования, а затем использовать его для последующих поисков.

В целом, я не думаю, что это одна из больших проблем в алгоритмах браузера.

0 голосов
/ 10 марта 2010

Простого использования регулярных выражений просто более чем достаточно. Взгляните на различные онлайн-инструменты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...