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).