La più semplice è probabilmente la ricerca binaria. Vedi -[NSArray indexOfObject:inSortedRange:options:usingComparator:]
.
In particolare, mi piacerebbe provare qualcosa di simile:
- pre-ordinare l'array che si salva al file
- quando si carica la matrice, forse
@selector(compare:)
(se si è preoccupato essere accidentalmente non ordinati o modificare l'ordinamento Unicode per alcuni casi limite). Questo dovrebbe essere di circa O (n) assumendo che la matrice sia in gran parte già ordinata.
- Per trovare la prima corrispondenza potenziale,
[array indexOfObject:searchString inSortedRange:(NSRange){0,[array count]} options:NSBinarySearchingInsertionIndex|NSBinarySearchingFirstEqual usingComparator:@selector(compare:)]
- Cammina lungo la matrice finché le voci non contengono più searchString come prefisso. Probabilmente si vuole fare caso il confronto/diacritic/larghezza-insensitive per determinare se si tratta di un prefisso (NSAnchoredSearch | NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch | NSWidthInsensitiveSearch)
Questo non può "correttamente" gestire tutte le localizzazioni (Turco in particolare), ma nessuno dei due sostituirà compare:
con localizedCompare:
, né ingenuo piegatura delle corde. (È lungo solo 9 righe, ma ha impiegato circa un giorno di lavoro per avere ragione e ha circa 40 linee di codice e 200 linee di test, quindi probabilmente non dovrei condividerlo qui.)
fonte
2012-07-20 20:59:14
Puoi provare a saltare le stringhe che non corrispondono nemmeno alla prima lettera, nessun punto nella ricerca dalle mele allo yogurt se la tua parola è zebra. Non sono sicuro del modo migliore per implementare questo, forse un array multidimensionale? La prima dimensione potrebbe essere la prima lettera, la seconda lettera della seconda dimensione, ecc., Fino a quando non è come terza o quarta lettera, quindi potresti semplicemente contenere il resto della parola. –
Se non hai bisogno di ordinare penso che i set siano più veloci quando si controlla se contiene o meno un oggetto. Tuttavia non è ancora ottimizzato per le stringhe.Probabilmente dovresti esaminare elementi come alberi binari, ecc. Se hai bisogno di creare un codice personalizzato, l'approccio generale sarebbe simile, indipendentemente dalla piattaforma/lingua con cui stai lavorando. –
C'è * sempre * un modo più veloce. Stai vedendo un ritardo nella tua interfaccia utente, però? Ho fatto esattamente la stessa cosa per il completamento automatico (con un array di input più piccolo) e non ho avuto lag visibile, nonostante l'algoritmo di ricerca ingenuo. – kubi