I tienen una estructura de datos que consiste de pares de valores, el primero de los cuales es un entero y la segunda de las cuales es una cadena alfanumérica (que puede comenzar con dígitos):¿Qué estructura de datos de C# permite buscar un par de cadenas de manera más eficiente para las subcadenas?
+--------+-----------------+
| Number | Name |
+--------+-----------------+
| 15 | APPLES |
| 16 | APPLE COMPUTER |
| 17 | ORANGE |
| 21 | TWENTY-1 |
| 291 | 156TH ELEMENT |
+--------+-----------------+
Una tabla de estos sería comprende hasta 100.000 filas.
Me gustaría proporcionar una función de búsqueda en la que el usuario pueda buscar ya sea el número (como si fuera una cadena), o piezas de la cadena. Idealmente, la búsqueda será "en vivo" a medida que el usuario escriba; después de cada pulsación de tecla (o tal vez después de una breve demora ~ 250-500 ms) se realizará una nueva búsqueda para encontrar los candidatos más probables. Así, por ejemplo, buscar en
1
volverá15 APPLES
,16 APPLE COMPUTER
,17 ORANGE
y291 156TH ELEMENT
15
va a limitar la búsqueda a15 APPLES
,291 156TH ELEMENT
AP
volverá15 APPLES
y16 APPLE COMPUTER
- (idealmente , pero no es obligatorio)
ELEM
devolverá291 156TH ELEMENT
.
Estaba pensando acerca del uso de dos Dictionary<string, string>
s ya en última instancia, los int
s se comparan como string
s - un índice voluntad por la parte entera y la otra por la parte de cadena.
Pero realmente buscar por subcadena no debería usar una función de hash, y parece un desperdicio usar el doble de la memoria que siento que debería necesitar.
En definitiva, la pregunta es, ¿existe alguna forma de realizar búsquedas de texto en dos grandes listas simultáneamente para las subcadenas?
En su defecto, ¿qué tal un SortedDictionary
? Puede aumentar el rendimiento pero aún así no resolvería el problema del hash.
Pensé en crear una expresión regular sobre la marcha, pero creo que funcionaría terriblemente.
Soy nuevo en C# (viniendo del mundo Java) así que no he investigado LINQ todavía; es esa la respuesta?
EDITAR 18:21 EST: Ninguna de las cadenas en el campo "Nombre" tendrá más de 12-15 caracteres, si eso afecta su posible solución.
creo una implementación ligeramente modificada de la [Algoritmo Knuth-Morris-Pratt] (http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm) haría sé útil. – ChaosPandion
Cuando dice "eficientemente", ¿quiere decir "rápido" o menos memoria? En general, en estos escenarios intercambia velocidad por memoria o encuentra algún equilibrio aceptable entre los dos. Además, ¿hay 100k cuerdas bastante estáticas, lo que significa que hay poca rotación y se buscan repetidamente? – EBarr
@EBarr: La memoria no es una gran preocupación, pero no quiero ser un desperdicio. La velocidad es más importante aquí. – Tenner