2009-07-16 115 views

Respuesta

8

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.

2

nunca utilizamos pero Google Sparsehash pueden trabajar

+2

pensé que sparsehase escrito en C++. –

+0

Creo que tiene razón – Nick

+1

De hecho, C es el idioma de interés en este caso, no C++. – SetJmp

0

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)" */ 
+5

error 404. ¿Podrías actualizar el enlace, por favor? –

0

Descargar tcl y utilizar su función de hash tcl a prueba de tiempo. Es fácil. La API de TCL está bien documentada.

4

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.)

+0

Gracias por presentar este libro. Acabo de hacer un pedido en Amazon. –

16

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)

+0

+1: Glib es de hecho una gran biblioteca. –

+1

¿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

+0

Glib solo admite 32 bits. Si trabajas con datos enormes, glib no será una buena opción – Thorn

5

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.

+0

Dang! ¡Necesito comprar esto! – refi64

55

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.

+1

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

+0

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

+0

El enlace libcfu muestra un error ... – zippy

3

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.

+0

Esto parece ser una práctica realidad opción para la programación en C. Tiene todo, ampliamente utilizado y probado, bien documentado, .. – minghua

3

khash.h de samtools/BWA/seqtk/klib

enrollamiento https://raw.github.com/attractivechaos/klib/master/khash.h

través http://www.biostars.org/p/10353/

+2

aunque khash parece que está escrito para ser muy eficiente, una cosa le falta es la documentación/un ejemplo de juguete en uso ... –

+0

hay ejemplos aquí http: //www.biostars.org/p/10353/ – alex

+2

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. –

Cuestiones relacionadas