Struttura dati per avviatori velociCon il filtraggio di un dizionario

0

Ho una lista di parole inglesi. Sto provando a creare una struttura dati che mi consenta di eseguire rapidamente il filtro Avvia con filtri, ad esempio:

var words = dictionary.StartsWith("foo");

Stavo pensando di creare una struttura dati come questa:

Ma volevo prima chiedere:

a) La struttura dati di cui sopra ha già un nome?

b) È questo il modo più veloce per implementare quello che sto cercando?

Modifica: la struttura dei dati sarà costruita all'inizio e non modificata. Dovrò solo fare l'equivalente di StartsWith e Contains.

    
posta ConditionRacer 03.02.2013 - 23:37
fonte

2 risposte

3

Verifica i tentativi di ricerca ternaria: link

Ha un algoritmo molto efficace (probabilmente il più efficace) per le ricerche di parole, inclusa la corrispondenza parziale.

Se questo è vicino al caso di implementazione del completamento automatico, controlla questo: link

    
risposta data 04.02.2013 - 01:17
fonte
1

Questo non è identico a, ma molto simile a un albero B. È una generalizzazione su un albero di ricerca binario. Un albero di ricerca binario memorizza un valore su ciascun nodo e ha due figli, con il sottoalbero sinistro garantito inferiore a quel nodo e il sottoalbero destro garantito maggiore. Con un albero B, si memorizzano i valori k in ordine ordinato su ciascun nodo e si consente ai bambini k + 1 in base a quale tra due bambini si trova. Questa è fondamentalmente la stessa cosa, tranne che si ha uguaglianza invece di disuguaglianza (dal momento che ci sono solo 26 possibili scelte ad ogni passo). Inoltre, nota come nel tuo caso non stai effettivamente memorizzando i dati su ciascun nodo, ogni nodo usa solo le stesse lettere a-z per determinare quale bambino seguire. Quindi probabilmente conserveresti i bambini alle foglie. Non sono sicuro di come funzionerebbe l'equilibrio; dovresti creare nuovi nodi ogni volta che inserisci una parola che ha lo stesso prefisso di altre parole in termini di nodi che hai già.

Nel tuo caso, devi fornire maggiori dettagli in modo che possiamo rispondere b). Se il tuo elenco di parole è fisso e non cambia, la tua migliore scommessa potrebbe essere semplicemente una semplice matrice. Basta ordinarlo una volta. Quindi per trovare tutte le parole che iniziano con "pippo", basta fare una ricerca binaria per trovare "pippo" e "fopp", o le corrispondenze possibili possibili (arrotondate nelle direzioni appropriate). Quindi restituisci tutte le parole tra di loro. Questo ti darà logN + numResults in tempo complessità. È anche probabile che abbia costanti molto buone in quanto non è necessario seguire molti indicatori in giro. Inoltre ha praticamente zero sovraccarico di spazio. Ovviamente, se si aggiungono regolarmente parole al dizionario, questa non è una buona soluzione dato che l'aggiunta di una parola costa O (N), mentre le soluzioni ad albero probabilmente costano O (logN) per aggiungere una parola.

    
risposta data 04.02.2013 - 00:28
fonte

Leggi altre domande sui tag