Necesita una buena descripción general de los algoritmos de estructura de datos sucinta


14

(ya preguntado en el sitio principal , pero preguntando también aquí por una mejor cobertura, lo siento)

Como conocía las estructuras de datos sucintas, necesito desesperadamente una buena visión general de los desarrollos más recientes en esa área.

Busqué en Google y leí muchos artículos que pude ver en la parte superior de los resultados de Google sobre las solicitudes desde la parte superior de mi cabeza. Todavía sospecho que me he perdido algo importante aquí.

Aquí hay temas de particular interés para mí:

  1. Codificación sucinta de árboles binarios con operaciones eficientes para obtener el número de elementos primarios, secundarios izquierdo / derecho en un subárbol.

    La pregunta principal aquí es la siguiente: todos los enfoques que conozco suponen que los nodos del árbol se enumeran en orden de aliento (como en el trabajo pionero en esta área Jacobson, G. J (1988). Sucinta estructuras de datos estáticos), que no Parece apropiado para mi tarea. Trato con enormes árboles binarios dados en un diseño de profundidad primero y los índices de nodo de profundidad primero son claves para otras propiedades de nodo, por lo que cambiar el diseño del árbol tiene un costo que me gustaría minimizar. De ahí el interés en obtener referencias a trabajos considerando otros diseños de árbol BF.

  2. Grandes conjuntos de elementos de longitud variable en la memoria externa. Las matrices son inmutables: no necesito agregar / eliminar / editar los elementos. El único requisito es el tiempo de acceso al elemento O (1) y la menor sobrecarga posible, mejor que el enfoque directo de desplazamiento y tamaño. Aquí hay algunas estadísticas que reuní sobre datos típicos para mi tarea:

    número típico de artículos: cientos de millones, hasta decenas de mil millones;

    aproximadamente el 30% de los artículos tienen una longitud no mayor a 1 bit ;

    Los artículos del 40% al 60% tienen una longitud inferior a 8 bits;

    solo unos pocos porcentajes de elementos tienen una longitud entre 32 y 255 bits (255 bits es el límite)

    longitud promedio del artículo ~ 4 bit +/- 1 bit.

    cualquier otra distribución de longitudes de elementos es teóricamente posible pero todos los casos prácticamente interesantes tienen estadísticas cercanas a las descritas anteriormente.

Enlaces a artículos de cualquier complejidad, tutoriales de cualquier oscuridad, bibliotecas C / C ++ más o menos documentadas, cualquier cosa que haya sido útil para usted en tareas similares o que parezca así por su conjetura educada, todas esas cosas son apreciadas con gratitud.

Actualización : Olvidé agregar a la pregunta 1: los árboles binarios con los que estoy tratando son inmutables. No tengo requisitos para alterarlos, todo lo que necesito es atravesarlos de varias maneras, siempre moviéndome del nodo a los hijos o al padre, de modo que el costo promedio de tales operaciones sea O (1).

Además, el árbol típico tiene miles de nodos y no debe almacenarse completamente en la RAM.

Respuestas:


12

Supongo que está interesado en estructuras de datos de memoria externa sucintas que sean eficientes en la práctica. En ese caso, probablemente pueda obtener lo que desea con algunas técnicas básicas y algo de ingeniería.

Para los árboles, comenzaría leyendo Arroyuelo et al .: Succinct Trees in Practice . El documento trata sobre los árboles en la memoria principal, pero la mayoría de las técnicas se pueden usar en la memoria externa con opciones similares a las siguientes.

γδsisi

norteSnorteS[yo]=1yojrunnortek(j)

Si desea mantener el índice de rango pequeño, debe hacer que el tamaño del bloque sea bastante grande (probablemente kilobytes o decenas de kilobytes), lo que hace que la solución básica anterior sea intensiva en CPU. Esto se puede resolver agregando un poco de sobrecarga a los bloques almacenados en el disco. Básicamente, aplica la misma solución de forma recursiva, de modo que cada bloque de disco almacena un número de bloques pequeños, así como otro índice de clasificación. Cuando haya recuperado el bloque de disco correcto, utilice el índice de clasificación dentro de él para encontrar el bloque pequeño correcto para decodificar, en lugar de decodificar todo el bloque. Con este índice secundario, los accesos aleatorios probablemente se unen a E / S incluso con las unidades de estado sólido más rápidas disponibles.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.