Estoy interesado principalmente en claves de cadena. ¿Puede alguien señalarme hacia una biblioteca?Buscando una buena implementación de tabla hash en C
Respuesta
Para cadenas, el Judy Array podría ser bueno.
Una matriz de Judy es una estructura de datos de matriz asociativa compleja pero muy rápida para almacenar y buscar valores utilizando enteros o claves de cadena. A diferencia de las matrices normales, las matrices Judy pueden ser dispersas; es decir, pueden tener grandes rangos de índices no asignados.
Aquí hay un Judy library in C.
Una biblioteca de C que proporciona una tecnología de núcleo de última generación que implementa una matriz dinámica dispersa. Las matrices Judy se declaran simplemente con un puntero nulo. Una matriz de Judy consume memoria solo cuando está poblada, pero puede crecer para aprovechar toda la memoria disponible si así lo desea.
Otras referencias,
Este Wikipedia hash implementation reference tiene algunas C
enlaces de código abierto.
Además, cmph - Una biblioteca mínima de Perfect Hashing en C
, admite varios algoritmos.
nunca utilizamos pero Google Sparsehash pueden trabajar
http://www.cl.cam.ac.uk/~cwc22/hashtable/
funciones definidas
* create_hashtable
* hashtable_insert
* hashtable_search
* hashtable_remove
* hashtable_count
* hashtable_destroy
Ejemplo de uso
struct hashtable *h;
struct some_key *k;
struct some_value *v;
static unsigned int hash_from_key_fn(void *k);
static int keys_equal_fn (void *key1, void *key2);
h = create_hashtable(16, hash_from_key_fn, keys_equal_fn);
insert_key = (struct some_key *) malloc(sizeof(struct some_key));
retrieve_key = (struct some_key *) malloc(sizeof(struct some_key));
v = (struct some_value *) malloc(sizeof(struct some_value));
(You should initialise insert_key, retrieve_key and v here)
if (! hashtable_insert(h,insert_key,v))
{ exit(-1); }
if (NULL == (found = hashtable_search(h,retrieve_key)))
{ printf("not found!"); }
if (NULL == (found = hashtable_remove(h,retrieve_key)))
{ printf("Not found\n"); }
hashtable_destroy(h,1); /* second arg indicates "free(value)" */
error 404. ¿Podrías actualizar el enlace, por favor? –
Hay algunas buenas respuestas aquí:
Container Class/Library for C
http://sglib.sourceforge.net.
http://cbfalconer.home.att.net/download/
Descargar tcl y utilizar su función de hash tcl a prueba de tiempo. Es fácil. La API de TCL está bien documentada.
C Interfaces and Implementations discute las implementaciones de tablas hash en C. El código fuente es available online. (Mi copia del libro está en el trabajo, así que no puedo ser más específico.)
Gracias por presentar este libro. Acabo de hacer un pedido en Amazon. –
GLib es una gran biblioteca para utilizar como base en sus proyectos C. Tienen algunas ofertas decentes estructura de datos, incluyendo las tablas hash: http://developer.gnome.org/glib/2.28/glib-Hash-Tables.html (enlace actualiza 4/6/2011)
+1: Glib es de hecho una gran biblioteca. –
¿Estoy en lo cierto al pensar que normalmente se vincula dinámicamente a la biblioteca glib para usar estas estructuras de datos, creando potencialmente problemas de portabilidad si se mueve de Linux a Windows? – bph
Glib solo admite 32 bits. Si trabajas con datos enormes, glib no será una buena opción – Thorn
gperf - Perfecto generador de funciones Hash
http://www.ibm.com/developerworks/linux/library/l-gperf.html
Dave Hanson C Interfaces and Implementations incluye una tabla de dispersión fina y varios otras estructuras de datos bien diseñadas.También hay una bonita interfaz de procesamiento de cadenas. El libro es excelente si puedes pagarlo, pero incluso si no, he encontrado que este software está muy bien diseñado, lo suficientemente pequeño como para aprenderlo en su totalidad, y fácil de reutilizar en varios proyectos diferentes.
Dang! ¡Necesito comprar esto! – refi64
stl tiene un mapa y hash_map (hash_map solo está en algunas implementaciones) que son clave de valor si puede usar C++.
ha pasado mucho tiempo desde que hice esta pregunta ... ahora puedo añadir mi propia biblioteca de dominio público a la lista:
que tenían la misma necesidad y Hice algunas investigaciones y terminé usando libcfu
Es simple y legible, así que si tengo que modificarlo, puedo hacerlo sin perder demasiado tiempo para entenderlo. También es de licencia BSD. No hay necesidad de cambiar mis estructuras (a incrustar decir un siguiente puntero)
tuve que rechazar las otras opciones por las siguientes razones (mis razones personales, tu caso es distinto):
- sglib -> es un laberinto macro y no me sentía cómodo depurando/haciendo cambios en en una base de código con macros
- cbfalconer -> gran cantidad de licencias de banderas rojas, y el sitio estaba abajo y demasiadas discusiones desfavorables en la web sobre soporte/autor; no quería correr el riesgo
- google sparce-hash -> como se dijo anteriormente, es para C++, no C
- glib (gnome hash) -> parecía muy prometedor; pero no pude encontrar ninguna manera fácil de instalar el kit de desarrollo; Solo necesitaba las rutinas/archivos C - no el entorno de desarrollo completo
- Judy -> parece demasiado complejo para un uso simple ... tampoco estaba listo para depurarme si tuviera que encontrarme con algún problema
- npsml (mencionado aquí) -> no se puede encontrar la fuente
- strmap encontrado muy simple y útil - es demasiado simplista que tanto la clave como el valor deben ser cadenas; valor siendo cadena parece demasiado restrictivo (debe aceptar nulo *)
- uthash -> parece bueno (ha sido mencionado en wikipedia en hashtable); encontré que requiere que struct se modifique - no quería hacer eso, ya que el rendimiento no es realmente una preocupación para mi uso, es más velocidad de desarrollo.
En resumen, para un uso muy simple strmap es bueno; uthash si le preocupa el uso de memoria adicional. Si solo la velocidad de desarrollo o la facilidad de uso es el objetivo principal, libcfu gana [note libcfu internamente hace la asignación de memoria para mantener los nodos/hashtables]. Es sorprendente que no haya muchas implementaciones simples de hash C disponibles.
noto que uthash parece estar más activamente desarrollado que libcfu (2005 vintage). quizás este no es un problema para un pequeño código: ¿te has encontrado con otros contendientes desde este post? – bph
Tengo un gran conjunto de datos, y glib no admite ese big data (claves de 32 bits). Necesito algo más que glib. ¿Qué hay de libcfu? – Thorn
El enlace libcfu muestra un error ... – zippy
La biblioteca APR de Apache tiene su propia hash-implementation. Ya está portado a todo lo que Apache ejecuta y el Apache license es bastante liberal también.
Esto parece ser una práctica realidad opción para la programación en C. Tiene todo, ampliamente utilizado y probado, bien documentado, .. – minghua
khash.h de samtools/BWA/seqtk/klib
enrollamiento https://raw.github.com/attractivechaos/klib/master/khash.h
aunque khash parece que está escrito para ser muy eficiente, una cosa le falta es la documentación/un ejemplo de juguete en uso ... –
hay ejemplos aquí http: //www.biostars.org/p/10353/ – alex
Veo un ejemplo, que no ofrece ninguna explicación y, similar a los documentos, tiene nombres de variables no descriptivas de una letra y sin comentarios. Es molesto, ya que sin duda está haciendo algo sencillo. –
- 1. ¿Tiene una buena función hash para una tabla hash C++?
- 2. Buscando una buena implementación de SIP en C#
- 3. Implementación de tabla hash
- 4. Algoritmo de hash para la implementación de la tabla hash
- 5. Buscando una matriz (vs lista enlazada) implementación de tablas hash en C
- 6. Buscando una rápida función hash
- 7. implementación de tabla dinámica C++
- 8. Buscando una buena introducción en trie
- 9. Buscando una implementación "at" escalable
- 10. Existe una buena implementación de radixsort para flotadores en C#
- 11. ¿Qué es una buena función hash?
- 12. ¿Qué es una buena función hash para palabras en inglés?
- 13. ¿El STL contiene una tabla hash?
- 14. Construyendo una función hash/tabla hash
- 15. C#: Buena/mejor implementación del método Swap
- 16. Cómo crear una tabla hash
- 17. C++: Puntero como clave en una tabla hash
- 18. Buscando una buena biblioteca de wavelets de C/C++ para el procesamiento de señal
- 19. Existe una buena implementación en C de Buffers del Protocolo de Google
- 20. ¿Tabla hash más rápida en C# que en C++?
- 21. tabla hash en JavaScript
- 22. Está buscando una tabla hash para un valor que no está allí O (n)? (sondeo lineal)
- 23. ¿Qué es una buena implementación de árbol abierto de código abierto en C?
- 24. ¿Cómo creo una tabla hash en Java?
- 25. ¿Cuál es una buena implementación de eventos débiles para Silverlight?
- 26. Interfaz C# e implementación en el mismo archivo - ¿buena idea?
- 27. ¿Alguna buena implementación de Qt + Lisp?
- 28. Una implementación buena y básica de la clase BigInt en C++
- 29. Forma más concisa para inicializar una tabla hash C#
- 30. Cualquier implementación de árbol hash Java?
pensé que sparsehase escrito en C++. –
Creo que tiene razón – Nick
De hecho, C es el idioma de interés en este caso, no C++. – SetJmp