devo una struttura di dati che consiste di coppie di valori, il primo dei quali è un numero intero e la seconda delle quali è una stringa alfanumerica (che può iniziare con cifre):Quale struttura dati C# consente di cercare le stringhe in modo più efficiente per le sottostringhe?
+--------+-----------------+
| Number | Name |
+--------+-----------------+
| 15 | APPLES |
| 16 | APPLE COMPUTER |
| 17 | ORANGE |
| 21 | TWENTY-1 |
| 291 | 156TH ELEMENT |
+--------+-----------------+
Una tabella di questi sarebbe comprendono fino a 100.000 righe.
Vorrei fornire una funzione di ricerca in cui l'utente può cercare il numero (come se fosse una stringa) o pezzi della stringa. Idealmente la ricerca sarà "live" come l'utente digita; dopo ogni sequenza di tasti (o forse dopo un breve ritardo di ~ 250-500 ms) verrà eseguita una nuova ricerca per trovare i candidati più probabili. Così, ad esempio, la ricerca su
1
tornerà15 APPLES
,16 APPLE COMPUTER
,17 ORANGE
, e291 156TH ELEMENT
15
sarà restringere la ricerca a15 APPLES
,291 156TH ELEMENT
AP
torneranno15 APPLES
e16 APPLE COMPUTER
- (idealmente , ma non richiesto)
ELEM
restituirà291 156TH ELEMENT
.
Stavo pensando di utilizzare due Dictionary<string, string>
s poiché in definitiva le int
s vengono confrontati come string
s - un indice piacimento la parte intera e l'altra dalla parte stringa.
Ma la ricerca per sottostringa non dovrebbe utilizzare una funzione di hash e sembra inutile utilizzare il doppio della memoria di cui ho bisogno.
In definitiva, la domanda è: esiste un modo efficace per cercare nel testo due elenchi di grandi dimensioni contemporaneamente per sottostringhe?
In caso contrario, che ne dici di uno SortedDictionary
? Potrebbe aumentare le prestazioni ma non risolverebbe il problema dell'hash.
Pensavo di creare una regex al volo, ma pensavo che avrebbe funzionato terribilmente.
Sono nuovo di C# (essendo venuto dal mondo Java), quindi non ho ancora esaminato LINQ; è questa la risposta?
MODIFICA 18:21 EST: nessuna delle stringhe nel campo "Nome" sarà più lunga di 12-15 caratteri, se ciò influisce sulla potenziale soluzione.
penso un'implementazione leggermente modificata del [Algoritmo di Knuth-Morris-Pratt] (http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm) sarebbe essere utile. – ChaosPandion
Quando dici "efficientemente" intendi "rapidamente" o meno memoria? Generalmente in questi scenari scambi la velocità per la memoria o trovi un equilibrio accettabile tra i due. Anche la stringa 100k è abbastanza statica, il che significa che c'è poco turnover e vengono cercati ripetutamente? – EBarr
@EBarr: la memoria non è una grande preoccupazione, ma non voglio sprecare. La velocità è più importante qui. – Tenner