Domanda

Ci sono delle librerie ben noti in Java per vettori po 'scarne?

(E ci sono linee guida su come scarsa è utile per usarli contro java.util.BitSet ?)

È stato utile?

Soluzione

Il colt biblioteca trovi matrici sparse (1D, 2D e 3D). Ha anche un Bitvector efficiente, con 1 bit per valore, anziché 8-bit come boolean[] fa.

Tuttavia, le matrici sparse non supportano direttamente i bit - solo doppie e oggetti. Si potrebbe avvolgere la 1D sparse doppia matrice per Maping indice di bit per lunghi indici (bitIndex>>6) poiché ogni tiene lungo 64 bit, convert il doppio recuperato ad un valore lungo greggio, e manipolazione uso bit all'accesso bit della recuperato lungo. Un po 'di lavoro, ma in nessun posto vicino tanto quanto l'attuazione del vettore sparse da soli. Una volta che l'involucro sta lavorando, si potrebbe evitare la conversione doppie a Longs, e mettere in atto una vera e propria matrice sparsa lungo 1d utilizzando il codice sorgente disponibile per Colt matrice del doppio 1D sparse come punto di partenza.

EDIT: Maggiori informazioni. I vettori Colt / matrici non richiedono memoria inizialmente per l'archiviazione, assumendo tutti i bit (long) sono inizialmente 0. Impostando un valore diverso da zero memoria consuma. Impostare la schiena valore a 0 continua a consumare memoria, anche se la memoria per i valori zero viene recuperato periodicamente.

Se i bit sono veramente scarse, in modo tale che ogni valore lungo sostegno ha un solo bit impostato, allora l'overhead di memorizzazione sarà molto povera, richiedono 64 bit per bit effettivo memorizzati. Ma come si parla caso tipico è 20-40% scarsa, allora l'overhead sarà molto più bassa, con contenitore possibilmente senza sprecata se i bit sono raggruppati in intervalli, ad esempio bit da 0-100, poi 1000-1100 e 2000-2200 (valori in esadecimale.) Nel complesso, solo 1/16 della regione è assegnata a pezzi, ma i mezzi di clustering che i bit sono memorizzati senza spazio sprecato.

Altri suggerimenti

TL; DR andate qui in Java

So che questa è una domanda "vecchio", ma avendo la stessa domanda mi sono imbattuto in questo post. Mentre le risposte sono buone, mi è stato alla fine non soddisfatto. Dopo ulteriore scavo, credo di aver incontrato la risposta "definitiva" alla domanda di bitsets sparse in Java.

questa presentazione l'autore, il Dr. Bruce Haddon, discute gli sforzi dei suoi ricercatori per creare una sostituzione altamente memoria efficiente e ad alte prestazioni per la BitSet standard di Java.

I collegamenti originali per la sua presentazione sono morti, ma ho contattato il dottor Haddon e hanno conservato sia il codice e la presentazione qui:

https://github.com/brettwooldridge/SparseBitSet

non posso consigliare la lettura di questa presentazione più altamente. Si tratta di una lettura affascinante anche se non avete alcun interesse a set po 'scarne, è più circa la vera natura del problem solving ...

Slides: E 'Informatica, Ingegneria del Software, o Hacking ?

Se la sua davvero scarsa (per esempio, meno dell'1% di carico), quindi utilizzando una tabella di hash indicizzati da indice di bit è probabilmente abbastanza buono; semplice presenza o assenza dell'indice nella tabella è tutto il necessario sapere se il bit è uno o zero rispettivamente.

Se la densità è verso l'alto di pochi punti percentuali, è possibile utilizzare una tabella hash indicizzati da indice di bit diviso per 64, e negozio di lunga le parole nella tabella hash che contiene i bit effettivi. Bit N è impostato se la tabella hash contiene il valore V per int (N / 64) e (V >> (N mod 64)) & 1 è vero.

Entrambe queste risposte presuppongono che si desidera ottimizzare l'accesso casuale ai bit. Se si desidera ottimizzare sequenziale (o altro accesso) ai bit di indice, quindi si consiglia una struttura a matrice sparsa, utilizzando lo stesso tipo di rappresentazione vettore di bit di basso livello in funzione della densità previsto. Vedere Sparse Matrici

Si potrebbe provare a di FastUtil AVL Albero Mappa .

CERN COLT è ampiamente utilizzato per il calcolo vettoriale e matrice, e ha matrici sparse, ma non sono utilizzate in modo specifico per i vettori di bit.

http: //acs.lbl gov / software / colt / api / CERN / colt / matrice / impl / SparseObjectMatrix1D.html

Una tabella hash in cui la mera presenza o l'assenza della chiave vi dice qualcosa? Questo sarebbe un hash set allora! Sono scettico delle prestazioni di un set (anche uno hash) sopra il BitSet. Dipende molto dal fatto che la velocità o la memoria è il driver principale.

Si potrebbe provare la libreria JavaEWAH.

https://code.google.com/p/javaewah/

A seconda del problema, può essere una buona forma.

(E 'utilizzato da Apache Hive e altri.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top