Un hecho que siempre me ha parecido gracioso es que Google está dirigido por la bioinformática (bueno, eso me parece gracioso porque soy una bioinf ... cosita). Dejame explicar.
La bioinformática tuvo desde el principio el desafío de buscar textos pequeños en cadenas gigantes muy rápido. Para nosotros, la "cadena gigantesca" es, por supuesto, ADN. A menudo, no es un solo ADN sino una base de datos de varios ADN de diferentes especies / individuos. Los pequeños textos son proteínas o su contraparte genética, un gen. La mayor parte del primer trabajo de los biólogos computacionales se limitó a encontrar homologías entre genes. Esto se hace para establecer la función de genes recién descubiertos al observar similitudes con genes que ya se conocen.
Ahora, estas cadenas de ADN se vuelven realmente muy grandes y (¡con pérdidas!) La búsqueda debe realizarse de manera extremadamente eficiente. La mayor parte de la teoría moderna de la búsqueda de cadenas se desarrolló así en el contexto de la biología computacional.
Sin embargo, hace bastante tiempo, la búsqueda de texto convencional se agotó. Se necesitaba un nuevo enfoque que permitiera buscar cadenas grandes en tiempo sublineal, es decir, sin mirar cada carácter individual. Se descubrió que esto se puede resolver procesando previamente la cadena grande y construyendo una estructura de datos de índice especial sobre ella. Se han propuesto muchas estructuras de datos diferentes. Cada uno tiene sus fortalezas y debilidades, pero hay una que es especialmente notable porque permite una búsqueda en tiempo constante. Ahora, en los órdenes de magnitud en los que opera Google, esto ya no es estrictamente cierto porque se debe tener en cuenta el equilibrio de carga entre los servidores, el preprocesamiento y algunas otras cosas sofisticadas.
Pero, en esencia, el llamado índice q-gram permite una búsqueda en tiempo constante. La única desventaja: la estructura de datos se vuelve ridículamente grande. Esencialmente, para permitir una búsqueda de cadenas con hasta q caracteres (de ahí el nombre), se requiere una tabla que tenga un campo para cada combinación posible de q letras (es decir, q S , donde S es el tamaño del alfabeto , digamos 36 (= 26 + 10)). Además, debe haber un campo para cada posición de letra en la cadena que se indexó (o en el caso de Google, para cada sitio web).
Para mitigar el gran tamaño, Google probablemente utilizará múltiples índices (de hecho, lo hacen , para ofrecer servicios como corrección ortográfica). Los más altos no funcionarán a nivel de personaje sino a nivel de palabra. Esto reduce q pero hace que S sea infinitamente más grande, por lo que tendrán que usar tablas hash y de colisión para hacer frente al número infinito de palabras diferentes.
En el siguiente nivel, estas palabras hash apuntarán a otras estructuras de datos de índice que, a su vez, apuntarán caracteres hash a sitios web.
En pocas palabras, estas estructuras de datos de índice de q -gram son posiblemente la parte más central del algoritmo de búsqueda de Google. Desafortunadamente, no hay buenos artículos no técnicos que expliquen cómo funcionan los índices q -gram. La única publicación que conozco que contiene una descripción de cómo funciona tal índice es ... ay, mi tesis de licenciatura .