Quiero almacenar cadenas y emitir cada una con un número de identificación único (un índice estaría bien). Solo necesitaría una copia de cada cadena y necesito una búsqueda rápida. Compruebo si la cadena existe en la tabla con la suficiente frecuencia que noto un golpe de rendimiento. ¿Cuál es el mejor contenedor para usar para esto y cómo busco si la cadena existe?contenedor para la búsqueda rápida de nombres
Respuesta
Sugeriría tr1 :: unordered_map. Se implementa como un hashmap por lo que tiene una complejidad esperada de O (1) para las búsquedas y el peor caso de O (n). También hay una implementación de impulso si su compilador no es compatible con tr1.
#include <string>
#include <iostream>
#include <tr1/unordered_map>
using namespace std;
int main()
{
tr1::unordered_map<string, int> table;
table["One"] = 1;
table["Two"] = 2;
cout << "find(\"One\") == " << boolalpha << (table.find("One") != table.end()) << endl;
cout << "find(\"Three\") == " << boolalpha << (table.find("Three") != table.end()) << endl;
return 0;
}
suena como una matriz funcionaría muy bien donde el índice es el índice en la matriz. Para verificar si existe, solo asegúrese de que el índice esté dentro de los límites de la matriz y que su entrada no sea NULA.
EDITAR: si ordena la lista, siempre puede utilizar una búsqueda binaria que debe tener una búsqueda rápida.
EDIT: Además, si desea buscar una cadena, siempre se puede utilizar un std::map<std::string, int>
también. Esto debería tener algunas velocidades de búsqueda decentes.
Tengo un problema de rendimiento con las matrices, necesito logN –
espere para que pueda decir exists ("my_string")? –
Pensé que querías poder hacer: C [índice] para obtener la cadena. –
Pruebe std :: map.
¿Las cadenas para buscar se encuentran disponibles estáticamente? Es posible que desee mirar a un perfect hashing function
más sencilla es utilizar std :: mapa.
funciona así:
#include <map>
using namespace std;
...
map<string, int> myContainer;
myContainer["foo"] = 5; // map string "foo" to id 5
// Now check if "foo" has been added to the container:
if (myContainer.find("foo") != myContainer.end())
{
// Yes!
cout << "The ID of foo is " << myContainer["foo"];
}
// Let's get "foo" out of it
myContainer.erase("foo")
Como ya comenté en la respuesta de @ Teran: ¿No sería
dijo que quiere buscar por una cadena en el comentario a la respuesta de Terans si lo tengo bien –
bien, no lo hizo ... pero supongo que lo hizo :) –
En primer lugar que debe ser capaz de cuantificar sus opciones. También nos ha informado que el patrón de uso principal que le interesa es búsqueda, no la inserción.
Let N
sea el número de cadenas que se espera que se tenga en la tabla, y dejar C
ser el número medio de caracteres en cualquier cadena dada presentes en dicha tabla (o en las cadenas que se compara con la mesa).
En el caso de un enfoque basado en hash, para cada búsqueda que paga los costes siguientes:
O(C)
- calcular el hash de la cadena que está a punto de mirar hacia arriba- entre
O(1 x C)
yO(N x C)
, donde1..N
es el costo que espera al atravesar el depósito basado en la clave hash, aquí multiplicado porC
para volver a verificar los caracteres en cada cadena en contra de la búsqueda de claves - tiempo total: entre
O(2 x C)
yO((N + 1) x C)
En el caso de un enfoque basado en
std::map
(que utiliza árboles rojo-negro), para cada búsqueda que paga la costes siguientes:- tiempo total: entre
O(1 x C)
yO(log(N) x C)
- dondeO(log(N))
es el coste máximo recorrido del árbol, yO(C)
es el tiempo que 0 genéricaless<>
aplicación's se necesita para volver a comprobar su clave de búsqueda durante el recorrido del árbol
- tiempo total: entre
En el caso de los grandes valores de N
y en ausencia de una función hash que garantiza menos de log (n) las colisiones, o si solo quiere ir a lo seguro, , es mejor utilizar un enfoque basado en árbol (std::map
). Si N es pequeño, por todos los medios, utilizar un enfoque basado en hash (. Al mismo tiempo asegurándose de que la colisión de hash es baja)
Antes de tomar cualquier decisión, sin embargo, también se debe verificar:
Google sparse hash quizá
probar esto:
- 1. Mejor colección para búsqueda rápida de cadenas
- 2. Contenedor de la API de búsqueda de Google para Node.js
- 3. "Búsqueda rápida" para una tabla SWT
- 4. Búsqueda rápida de MSDN en Firefox
- 5. Nombrar claves dict para una búsqueda rápida en python
- 6. ¿Cómo manejar los resultados del cuadro de búsqueda rápida y las sugerencias recientes para la búsqueda?
- 7. Búsqueda rápida de texto en los registros
- 8. Jsf Cómo crear un contenedor de nombres
- 9. Búsqueda rápida en archivos de texto comprimido
- 10. Búsqueda más rápida de archivos en Netbeans
- 11. Búsqueda rápida de elementos para un lenguaje funcional (Haskell)
- 12. cómo ordenar los datos geográficos para una búsqueda rápida
- 13. búsqueda rápida para el último elemento en un Django QuerySet?
- 14. Búsqueda rápida de la lista <T>
- 15. almacenamiento óptimo de estructura de datos para la búsqueda rápida y la persistencia
- 16. Plug-in para Visual Studio para archivos de búsqueda rápida en la solución
- 17. Búsqueda de nombres de ciudad en ios
- 18. ¿Cómo hace un diccionario una búsqueda rápida
- 19. Orden de búsqueda del espacio de nombres
- 20. Búsqueda de nombres en plantillas C++
- 21. Búsqueda de nombres con Apache Solr
- 22. ¿Estructura de datos de Javascript para una búsqueda rápida y un bucle ordenado?
- 23. Qué colección .NET proporciona la búsqueda más rápida
- 24. la búsqueda de todos los usuarios que tienen nombres duplicados
- 25. Crear un filtro de texto (como la búsqueda rápida) para un Spinner en Android
- 26. NSPredicar para la búsqueda de palabras múltiples
- 27. búsqueda rápida de texto completo en Windows Phone 7
- 28. Usar el contenedor IoC para la arquitectura de complementos
- 29. Cómo eludir la función de búsqueda rápida de Firefox y capturar la barra inclinada presiona
- 30. Mapa Hash optimizado para la búsqueda
No utilice unordered_map en T1, que no tiene el método de reserva y si se inserta un montón de cadena durante la fase de inserción que van a tener una gran cantidad de refrito. –
También unordered_map para cadenas largas es peor que un estándar :: map –