Un fatto che ho trovato divertente è che Google è in realtà gestito da bioinformatica ("kay, lo trovo divertente perché sono un bioinf ... cosa). Lasciatemi spiegare.
La bioinformatica all'inizio ha avuto la sfida di cercare piccoli testi in stringhe gigantesche molto velocemente. Per noi, la "stringa gigantesca" è ovviamente il DNA. Spesso non un singolo DNA ma un database di diversi DNA di diverse specie / individui. I piccoli testi sono proteine o la loro controparte genetica, un gene. La maggior parte del primo lavoro dei biologi computazionali si è limitato a trovare omologie tra i geni. Questo viene fatto per stabilire la funzione dei geni ritrovati di recente rilevando somiglianze con geni già noti.
Ora, queste stringhe di DNA diventano davvero molto grandi e la ricerca (con perdita!) Deve essere eseguita in modo estremamente efficiente. La maggior parte della moderna teoria della ricerca di stringhe è stata quindi sviluppata nel contesto della biologia computazionale.
Tuttavia, molto tempo fa, la ricerca di testo convenzionale era esaurita. Era necessario un nuovo approccio che permettesse di cercare grandi stringhe in tempo sublineare, cioè senza guardare ogni singolo carattere. Si è scoperto che questo può essere risolto pre-elaborando la stringa di grandi dimensioni e costruendo su di essa una speciale struttura di dati di indice. Sono state proposte molte strutture di dati di questo tipo. Ognuno ha i suoi punti di forza e di debolezza, ma ce n'è uno particolarmente notevole perché consente una ricerca in tempo costante. Ora, negli ordini di grandezza in cui opera Google, questo non è più strettamente vero perché è necessario tenere in considerazione il bilanciamento del carico tra i server, la preelaborazione e alcune altre cose sofisticate.
Ma in sostanza, il cosiddetto indice q-gram consente una ricerca in tempo costante. L'unico svantaggio: la struttura dei dati diventa ridicolmente grande. In sostanza, per consentire una ricerca di stringhe con un massimo di q caratteri (da cui il nome), richiede una tabella che abbia un campo per ogni possibile combinazione di q lettere (cioè, q S , dove S è la dimensione dell'alfabeto , diciamo 36 (= 26 + 10)). Inoltre, deve esserci un campo per ogni posizione della lettera nella stringa che è stata indicizzata (o, nel caso di google, per ogni sito web).
Per mitigare le dimensioni, Google probabilmente utilizzerà più indici (in effetti, lo fanno , per offrire servizi come la correzione dell'ortografia). Quelle più in alto non funzioneranno a livello di personaggio ma a livello di parola. Questo riduce q ma rende S infinitamente più grande, quindi dovranno usare hashing e tabelle di collisione per far fronte al numero infinito di parole diverse.
Al livello successivo, queste parole con hash punteranno ad altre strutture di dati di indice che, a loro volta, indicheranno caratteri hash che rimandano a siti web.
Per farla breve, queste strutture di dati dell'indice q -gram sono senza dubbio la parte più centrale dell'algoritmo di ricerca di Google. Sfortunatamente, non ci sono buoni documenti non tecnici che spieghino come funzionano gli indici q -gram. L'unica pubblicazione che conosco che contiene una descrizione di come funziona un tale indice è ... ahimè, la mia tesi di laurea .