Один факт, который я всегда находил забавным, - это то, что Google фактически управляется биоинформатикой (да ладно, мне это смешно, потому что я биоинф… штука). Позволь мне объяснить.
Вначале биоинформатика столкнулась с проблемой быстрого поиска небольших текстов в гигантских строках. Для нас «гигантская струна» - это, конечно, ДНК. Часто не одна ДНК, а база данных из нескольких ДНК разных видов / людей. Маленькие тексты - это белки или их генетический аналог, ген. Большая часть первой работы компьютерных биологов была ограничена поиском гомологий между генами. Это делается для определения функции вновь обнаруженных генов путем выявления сходства с уже известными генами.
Теперь эти цепочки ДНК действительно становятся очень большими, и (с потерями!) Поиск должен выполняться чрезвычайно эффективно. Таким образом, большая часть современной теории поиска струн была разработана в контексте вычислительной биологии.
Однако некоторое время назад обычный текстовый поиск исчерпал себя. Требовался новый подход, который позволял искать большие строки в сублинейное время, то есть без просмотра каждого отдельного символа. Было обнаружено, что эту проблему можно решить, предварительно обработав большую строку и построив над ней специальную структуру данных индекса. Было предложено много различных таких структур данных. У каждого есть свои сильные и слабые стороны, но есть один, который особенно примечателен, потому что он позволяет выполнять поиск в постоянное время. Теперь, если судить по порядку величины, в котором работает Google, это уже не совсем так, потому что необходимо учитывать балансировку нагрузки между серверами, предварительную обработку и некоторые другие сложные вещи.
Но, по сути, так называемый индекс q-граммы позволяет выполнять поиск за постоянное время. Единственный недостаток: структура данных становится невероятно большой. По сути, для поиска строк, содержащих до q символов (отсюда и название), требуется таблица, в которой есть одно поле для каждой возможной комбинации из q букв (то есть q S , где S - размер алфавита , скажем, 36 (= 26 + 10)). Кроме того, должно быть одно поле для каждой позиции буквы в индексированной строке (или, в случае Google, для каждого веб-сайта).
Чтобы уменьшить явный размер, Google, вероятно, будет использовать несколько индексов (на самом деле, они это делают , чтобы предлагать такие услуги, как исправление орфографии). Самые верхние работают не на уровне персонажа, а на уровне слов. Это уменьшает q, но делает S бесконечно больше, поэтому им придется использовать таблицы хеширования и коллизий, чтобы справиться с бесконечным количеством разных слов.
На следующем уровне эти хешированные слова будут указывать на другие структуры данных индекса, которые, в свою очередь, будут содержать хеш-символы, указывающие на веб-сайты.
Короче говоря, эти структуры данных индекса q -gram, возможно, являются самой центральной частью алгоритма поиска Google. К сожалению, нет хороших нетехнических статей, объясняющих, как работают индексы q -граммы. Единственная известная мне публикация, которая содержит описание того, как работает такой указатель, - это… увы, моя бакалаврская диссертация .