La más simple es probablemente la búsqueda binaria. Ver -[NSArray indexOfObject:inSortedRange:options:usingComparator:]
.
En particular, me gustaría probar algo como esto:
- pre-ordenar la matriz que se guarda en el fichero de
- cuando se carga la matriz, posiblemente
@selector(compare:)
(si está preocupado al respecto ser accidentalmente sin clasificar o cambiar el orden de clasificación Unicode para algunos casos extremos). Esto debería ser aproximadamente O (n) suponiendo que la matriz ya está ordenada en su mayoría.
- para encontrar la primera coincidencia potencial,
[array indexOfObject:searchString inSortedRange:(NSRange){0,[array count]} options:NSBinarySearchingInsertionIndex|NSBinarySearchingFirstEqual usingComparator:@selector(compare:)]
- caminar por la matriz hasta que las entradas ya no contienen searchString que como prefijo. Es posible que desee hacer comparaciones/diacrítica/ancho insensibles caso para determinar si se trata de un prefijo (NSAnchoredSearch | NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch | NSWidthInsensitiveSearch)
Esto no puede "correctamente" manejar todas las configuraciones regionales (en turco, en particular), pero tampoco sustituirá a compare:
con localizedCompare:
, ni será un plegado ingenuo. (Tiene solo 9 líneas de longitud, pero tomó aproximadamente un día de trabajo para hacerlo bien y tiene alrededor de 40 líneas de código y 200 líneas de prueba, por lo que probablemente no debería compartirlo aquí).
Puede intentar omita las cadenas que ni siquiera coinciden con la primera letra, no tiene sentido buscar manzanas o yogur si su palabra es cebra. No estoy seguro de la mejor manera de implementar esto, ¿quizás una matriz multidimensional? La primera dimensión podría ser la primera letra, la segunda segunda letra, etc., hasta que aparezca la tercera o la cuarta letra, entonces podría contener el resto de la palabra. –
Si no necesita ordenar, creo que los conjuntos son más rápidos al verificar si contiene un objeto o no. Sin embargo, todavía no está optimizado para cuerdas.Probablemente deberías buscar cosas como árboles binarios, etc. si necesitas crear un código personalizado, el enfoque general sería similar sin importar la plataforma/idioma con el que estés trabajando. –
Hay * siempre * una manera más rápida. ¿Estás viendo retraso en tu UI? He hecho exactamente lo mismo para autocompletar (con una matriz de entrada más pequeña) y no tuve ningún retraso visible, a pesar del ingenioso algoritmo de búsqueda. – kubi