2008-12-11 9 views
13

¿Cuál es una buena manera de representar un conjunto disperso de enteros (realmente direcciones de memoria C) de una manera compacta y rápida. Ya sé sobre las cosas obvias como los vectores de bits y la codificación de longitud de ejecución. pero quiero algo mucho más compacto que una palabra por conjunto de elementos. Necesito agregar y eliminar elementos y probar la membresía. No necesito otras operaciones de conjunto, como la unión.¿Representa los conjuntos de enteros dispersos?

Leí acerca de una de esas bibliotecas hace muchos años, pero desde entonces he olvidado su nombre. Creo que fue lanzado como fuente abierta por HP y tenía un nombre de mujer.

+1

La <1 palabra por poco puntero va a ser la parte más difícil. – BCS

+0

No dice cuántas direcciones almacenará en el conjunto. Eso es crítico. Además, no dices si provienen de Malloc. –

+0

Puede ver las respuestas a una pregunta similar que hice: http://stackoverflow.com/questions/36106/what-are-some-alternatives-to-a-bit-array – erickson

Respuesta

10

Usted se está refiriendo a una matriz judy. Fue un proyecto de HP. Creo que se usan en ruby ​​y están disponibles en c. Estructura de datos muy interesante. Haciendo uso del hecho de que las asignaciones están (al menos) alineadas con palabras, teniendo estructuras separadas para rangos densos y dispersos.

http://judy.sourceforge.net/index.html

+1

Gracias. "Judy" fue de hecho en el que estaba pensando. Nunca hubiera recordado ese nombre. –

1

Si todo lo que necesita es inserción, eliminación y prueba de membresía, entonces una tabla hash le conviene. Puedes encontrar algunas buenas funciones hash para hash enteros de 32 bits here.

+1

Eso no es lo suficientemente compacto -1 –

0

Si desea que la estructura sea más pequeña que el conjunto de datos, probablemente debería considerar algún tipo de arreglo de árbol. Realice cada nivel de 4 maneras en que la clave del árbol se separa de 2 bits comenzando en el extremo superior y puede compactarse bastante bien (si los punteros tienen algún grado de localidad espacial). El truco sería codificarlo lo suficientemente compacto (índices en matrices de nodos, un árbol mapeado en una matriz?).

4

Una estructura de datos muy compacta sería un filtro de floración, quizás un filtro de recuento de floración para admitir eliminaciones.

http://en.wikipedia.org/wiki/Bloom_filter

El filtro de Bloom, concebido por Burton H. Bloom en 1970, es una estructura de datos probabilística eficiente con el espacio que se utiliza para probar si un elemento es un miembro de un conjunto. Los falsos positivos son posibles, pero los falsos negativos no lo son. Se pueden agregar elementos al conjunto, pero no se eliminan (aunque esto se puede solucionar con un filtro de conteo)

+0

Gracias. Sé de estos pero no puedo aceptar falsos positivos (los falsos negativos podrían ser aceptables pero no tan ideales). –

Cuestiones relacionadas