2011-05-01 13 views
6
string[] words = System.IO.File.ReadAllLines("word.txt"); 
var query = from word in words 
      where word.Length > "abe".Length && word.StartsWith("abe") 
      select word; 
foreach (var w in query.AsParallel()) 
{ 
    Console.WriteLine(w); 
} 

Básicamente, la palabra.txt contiene 170000 palabras en inglés. ¿Hay una clase de colección en C# que sea más rápida que una matriz de cadena para la consulta anterior? No habrá inserción o eliminación, solo busque si una cadena comienza con "abe" o "abdi".¿Cuál es la clase de recopilación más eficiente en C# para la búsqueda de cadenas

Cada palabra en el archivo es única.

EDIT 1 Esta búsqueda se realizará potencialmente millones de veces en mi aplicación. También quiero seguir con LINQ para la consulta de recopilación porque podría necesitar usar la función de agregado.

EDIT 2 Las palabras del archivo ya están ordenados, el archivo no cambiará

+2

¿Cuál es el caso de uso? Alexai saca un buen punto, si se trata de una búsqueda única, entonces una matriz está bien. Si esto va a ser un escenario donde repites la búsqueda varias veces, entonces la respuesta es diferente. –

Respuesta

4

mismo que crearía un Dictionary<char, List<string>>, donde había agrupar palabras por su primera letra. Esto reducirá sustancialmente la búsqueda de la palabra necesaria.

+1

también es posible que desee consultar Wiki sobre el prefijo y el árbol de sufijos. Estos están destinados a la búsqueda rápida de palabras. – Eugen

+3

Creo que la estructura que busca en su comentario es * Trie *. –

+0

¿No complicaría la consulta de linq? – nobody

1

Si necesita hacer una búsqueda una vez, no hay nada mejor que la búsqueda lineal - array está perfectamente bien para ello.

Si necesita realizar búsquedas repetidas, puede considerar la eliminación de la matriz (n Log n) y la búsqueda con cualquier prefijo será rápida (n larga). Dependiendo del tipo de búsqueda, usar el diccionario de listas de cadenas indexadas por prefijo puede ser otra buena opción.

+0

vea mi edición anterior – nobody

+0

Si desea mantener el código lo más cerca posible de la señal y realizar un gran número de consultas SortedList parece una buena opción. Los árboles de prefijo mencionados por Eugen probablemente te darán mejor rendimiento pero requieren más codificación a mano. –

0

Si busca con mucha frecuencia, no cambie un archivo con palabras. Puede ordenar las palabras en el archivo cada vez que cambia de lista. Después de esto, puede usar la búsqueda biseccional. Por lo tanto, tendrá que hacer hasta 20 comparaciones para encontrar cualquier palabra que coincida con su clave y algunas comparaciones adicionales del vecindario.

Cuestiones relacionadas