se puede utilizar una estructura de datos de árbol simple como esto:
struct node {
node * leftChild;
node * rightChild;
long mask;
};
struct tree {
int exponent; // the size of the tree is 2^exponent
node rootNode;
};
Cada nodo representa un sub-conjunto de la gran matriz de bits que es (2^n) * tamaño de bits (largos), n> = 0. Los nodos hoja almacenan una máscara de bits sin formato en 'máscara' si están en la parte inferior del árbol, de lo contrario almacenan 0 en 'máscara'. De esta forma, el nodo hoja con un valor de 'máscara' de 0 puede representar un área vacía de tamaño (2^n) * de largo (largo) en la matriz de bits, por lo que las matrices de bits dispersas se pueden almacenar de manera eficiente.
leftChild y rightChild son, por supuesto, nulos en todos los nodos de hoja. Cada otro nodo tiene un puntero leftChild y rightChild, y cada nodo que no es un nodo hoja tiene al menos un nodo descendiente con máscara que tiene bits establecidos en él.
Para conocer un poco a un índice determinado:
bool find_bit_at_index(tree t, long ind) {
long divider = 1 << (t.exponent - 1);
node *n = &t.rootNode;
node *lastNode;
while (n)
{
lastNode = n;
if (ind >= divider) {
n = n->rightChild;
ind -= divider;
}
else {
n = n->leftChild;
}
divider >>= 1;
}
return lastNode->mask & (1 << ind);
}
Construir el árbol y el desarrollo del resto de los algoritmos debe ser bastante fácil una vez que entienda la idea. En realidad, no he probado el código, ya que esta no es una solución completa, podrían quedar algunos errores tipográficos o similares. Y no soy un experto en índices de mapas de bits, puede haber (probablemente) un paquete listo que lo haga mejor, pero esta solución es simple y debería ser relativamente eficiente. Es posible que el 1% aún no sea lo suficientemente escaso para hacerlo mejor en comparación con solo una matriz de bits simple (suponiendo que los datos almacenan 64 bits cada uno, no se requieren más de 2 búsquedas para tener más de un bit establecido en promedio), pero si la escasez aumenta más allá de lo que mostrarán los ahorros en espacio y tiempo.
Parece genial. Sospecho que no admite actualizaciones rápidas, sin embargo, si quisiera cambiar un poco en el medio de una ejecución, tendría que insertar dos palabras en el medio del flujo de bits comprimido. Quizás podrías almacenar el bitstream en un árbol enfilade para hacerlo eficiente. –
Muy bien, esto realmente me ayudó con mi tesis de licenciatura. Gracias un montón. Si tiene acceso, la codificación real se describe en este documento: http://dl.acm.org/citation.cfm?doid=502585.502689 – Honza