È necessaria una buona panoramica degli algoritmi di Succinct Data Structure


14

(già chiesto sul sito principale , ma chiedendo anche qui una migliore copertura, scusate)

Da quando ho saputo di Succinct Data Structures, ho un disperato bisogno di una buona panoramica degli sviluppi più recenti in quell'area.

Ho cercato su Google e letto molti articoli che ho potuto vedere in cima ai risultati di Google su richieste dalla parte superiore della mia testa. Sospetto ancora di aver perso qualcosa di importante qui.

Ecco alcuni argomenti di particolare interesse per me:

  1. Codifica succinta di alberi binari con operazioni efficienti per ottenere genitore, figlio sinistra / destra, numero di elementi in una sottostruttura.

    La domanda principale qui è la seguente: tutti gli approcci che conosco presuppongono che i nodi dell'albero siano elencati in ordine del respiro (come nel lavoro pionieristico in quest'area Jacobson, G. J (1988). Strutture dati statiche succinte), che non sembra appropriato per il mio compito. Mi occupo di enormi alberi binari forniti nel layout di profondità in primo luogo e gli indici di nodo in profondità in primo luogo sono le chiavi di altre proprietà del nodo, quindi la modifica del layout dell'albero ha dei costi per me che vorrei minimizzare. Da qui l'interesse per ottenere riferimenti a lavori considerando altri layout dell'albero BF.

  2. Grandi matrici di lunghezza variabile nella memoria esterna. Le matrici sono immutabili: non ho bisogno di aggiungere / cancellare / modificare gli elementi. L'unico requisito è il tempo di accesso dell'elemento O (1) e il minor sovraccarico possibile, migliore quindi un approccio offset e dimensionale semplice. Ecco alcune statistiche che ho raccolto sui dati tipici per il mio compito:

    numero tipico di articoli - centinaia di milioni, fino a decine di miliardi;

    circa il 30% degli articoli ha una lunghezza non superiore a 1 bit ;

    40% -60% di articoli hanno una lunghezza inferiore a 8 bit;

    solo alcune percentuali di elementi hanno una lunghezza compresa tra 32 e 255 bit (255 bit è il limite)

    lunghezza media dell'articolo ~ 4 bit +/- 1 bit.

    qualsiasi altra distribuzione delle lunghezze degli articoli è teoricamente possibile, ma tutti i casi praticamente interessanti hanno statistiche vicine a quelle sopra descritte.

Collegamenti ad articoli di qualsiasi complessità, tutorial di qualsiasi oscurità, librerie C / C ++ più o meno documentate, - qualsiasi cosa ti sia stata utile in compiti simili o che cosa assomigli alle tue ipotesi colte - tutte queste cose sono apprezzate con gratitudine.

Aggiornamento : ho dimenticato di aggiungere alla domanda 1: gli alberi binari con cui ho a che fare sono immutabili. Non ho requisiti per modificarli, tutto ciò di cui ho bisogno è solo attraversarli in vari modi passando sempre dal nodo ai figli o ai genitori, in modo che il costo medio di tali operazioni fosse O (1).

Inoltre, l'albero tipico ha miliardi di nodi e non dovrebbe essere completamente archiviato nella RAM.

Risposte:


12

Presumo che tu sia interessato a strutture dati di memoria esterna sintetiche che siano efficienti nella pratica. In tal caso, puoi probabilmente ottenere ciò che desideri con alcune tecniche di base e un po 'di ingegneria.

Per gli alberi, vorrei iniziare con la lettura di Arroyuelo et al .: Succinct Trees in Practice . L'articolo tratta degli alberi nella memoria principale, ma la maggior parte delle tecniche può essere utilizzata nella memoria esterna con scelte simili a quelle riportate di seguito.

γδBB

nSnS[io]=1iojrun'nK(j)

Se si desidera mantenere piccolo l'indice di classificazione, è necessario aumentare le dimensioni del blocco (probabilmente kilobyte o decine di kilobyte), rendendo la soluzione di base sopra citata per la CPU. Questo può essere risolto aggiungendo un po 'di sovraccarico ai blocchi memorizzati sul disco. Fondamentalmente si applica la stessa soluzione in modo ricorsivo, in modo che ogni blocco del disco memorizzi un numero di piccoli blocchi e un altro indice di rango. Dopo aver recuperato il blocco disco corretto, si utilizza l'indice di rango al suo interno per trovare il piccolo blocco giusto da decodificare, anziché decodificare l'intero blocco. Con questo indice secondario, gli accessi casuali probabilmente diventano associati a I / O anche con le unità a stato solido più veloci disponibili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.