Suggerirei anche di pre-elaborare il tuo database in un trie e di estendere il commento corrispondente dato da Christophe:
Dai un'occhiata all ' algoritmo di Aho-Corasick per la costruzione di un tale trie. L'idea generale è di avere una struttura dati ad albero che puoi seguire.
Nel tuo caso, consideriamo che hai anche la voce del database A B C E . Inizi a esaminare il trie con A (perché è il primo carattere della stringa di query). Esiste un tale nodo, perché i tuoi modelli validi includono A B e A B C E . Poi guardi il prossimo carattere della tua query, B , e trova una prima corrispondenza completa A B . Dal momento che hai bisogno del più lungo, vorrai continuare, naturalmente. Il nodo che hai raggiunto tramite A B è anche lo stesso nodo che continua a formare A B C E . Quindi continui con C e poi quando vuoi continuare con D non hai pattern validi con un prefisso di A B C D a sinistra.
Primo: puoi ripetere questo processo a partire da B e così via per ogni lettera della tua query. Questo ti darà la risposta corretta attraverso il massimo finale sulla lunghezza di tutti i modelli trovati. Non è molto efficiente, dal momento che puoi immaginare di eseguire più volte le stesse sottostringhe.
Inserisci la magia dei link di scelta rapida: il tuo trie contiene un nodo che rappresenta il prefisso A B C (dal modello A B C E ) e la tua query corrisponde a quel prefisso. Saprai quindi che la query meno il% co_de esaurito inizia con A . Sai anche in anticipo che B C ha B C D E come prefisso. Quindi al tuo trie può essere assegnata una scorciatoia dal nodo B C al nodo A B C . Non è necessario ricominciare da capo, ma puoi continuare direttamente con B C dalla tua query. E poi D e hai abbinato E . Poiché non c'è più corrispondenza per B C D E disponibile, devi risciacquare e ripetere.
Anche in questo caso, la scorciatoia dal nodo F al nodo B C D E consente di riconoscere C D E entro altri due passaggi. A questo punto hai scoperto C D E F G , A B e B C D E mentre guardi solo i caratteri di input C D E F G una volta.
Per completezza, dopo aver abbinato A B C D E F G , salteresti direttamente a C D E F G corrispondente. Dato che la tua migliore scorciatoia disponibile (con le parole di esempio limitate che hai dato) è F G - non c'è nulla che inizi con F G e niente che inizi con D E F G , quindi E F G è la tua migliore scommessa e il collegamento punta a quel nodo .
Nota speciale: potrebbe essere necessario prestare particolare attenzione a riconoscere le parole sotto-modello. Ad esempio, considera il database contenente F G e A B C D E F G e il tuo input è C D E . Finirai nel nodo A B C D E F H e non avrai più scorciatoie disponibili, quindi inizierai dall'inizio con A B C D E F , ma nel frattempo dovrai occuparti di aver abbinato H .
Questo approccio, tuttavia, richiede di pre-elaborare l'intero database in anticipo. Sul lato positivo, si ottengono ricerche lineari molto veloci (lineari in diversi parametri - è possibile leggere i dettagli sulla pagina wikipedia collegata).