Si potrebbe utilizzare una semplice struttura dati ad albero simile a questo:
struct node {
node * leftChild;
node * rightChild;
long mask;
};
struct tree {
int exponent; // the size of the tree is 2^exponent
node rootNode;
};
Ogni nodo rappresenta un sub-array della grande matrice di bit che è (2^n) * sizeof (long) bit, n> = 0. I nodi foglia archiviano una maschera bit grezza in 'maschera' se si trovano nella parte inferiore dell'albero, altrimenti memorizzano 0 in 'maschera'. In questo modo, il nodo foglia con un valore 'maschera' di 0 può rappresentare un'area (2^n) * sizeof (lunga) di dimensioni vuote nell'array di bit, in modo che gli array di bit sparsi possano essere memorizzati in modo efficiente.
leftChild e rightChild sono ovviamente nulli in tutti i nodi foglia. Ogni altro nodo ha un puntatore leftChild e rightChild e ogni nodo che non è un nodo foglia ha almeno un nodo discendente con maschera che contiene bit impostati.
Per trovare un po 'ad un determinato indice:
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);
}
Costruire l'albero e lo sviluppo di tutto il resto degli algoritmi dovrebbe essere abbastanza facile una volta capito l'idea. Non ho effettivamente testato il codice, poiché questa non è una soluzione completa, alcuni refusi o simili potrebbero rimanere. E io non sono un esperto di indice bitmap, potrebbe esserci (probabilmente è) un pacchetto già pronto che lo fa meglio, ma questa soluzione è semplice e dovrebbe essere relativamente efficiente. L'1% potrebbe non essere ancora abbastanza spoglio per renderlo migliore rispetto a un semplice array di bit (supponendo che i lunghi memorizzino 64 bit ciascuno, non ci vogliono più di 2 lunghi per avere in media più di un bit), ma se il la scarsità aumenta oltre a quello che mostrerà il risparmio di spazio e di tempo.
fonte
2011-02-15 14:56:52
Sembra fantastico. Sospetto che non supporti gli aggiornamenti rapidi, tuttavia, se volessi cambiare un po 'nel mezzo di una corsa, dovresti inserire due parole nel mezzo del bitstream compresso. Forse potresti conservare il flusso di bit in un albero di enfilade per renderlo efficiente. –
Molto bello, questo in realtà mi ha aiutato con la mia tesi di laurea. Grazie mille. Se hai accesso, la codifica attuale è descritta in questo documento: http://dl.acm.org/citation.cfm?doid=502585.502689 – Honza