Riordinare i dati (set di stringhe) per ottimizzare la compressione?


12

Esistono algoritmi per riordinare i dati da ottimizzare per la compressione? Capisco che questo è specifico per i dati e l'algoritmo di compressione, ma c'è una parola per questo argomento? Dove posso trovare ricerche in questo settore?

In particolare, ho un elenco json di 1,5 milioni di stringhe e voglio riordinare le stringhe in modo da ottimizzare la compressione gzip (per HTTP). L'ordinamento delle stringhe fa abbastanza bene, ma non so davvero se sia ottimale.


1
Il riordino ottimale delle stringhe per la compressione gzip (LZ77 con una piccola finestra scorrevole) suona come un problema NP-difficile. Probabilmente puoi trovare una riduzione dal più breve problema comune delle superstringhe.
Jouni Sirén,

@ JouniSirén Penso che la sottostringa comune più lunga sia un approccio migliore poiché la superstring comune più corta mi limita ad avere la parte comune schiena contro schiena, giusto? Non mi dispiace NP-duro finché è trattabile (come richiede un giorno per correre su una macchina moderna).
Jayen,

Risposte:


6

Questa è un'aggiunta alla risposta di Navin Goyal.

Poiché un file JSON può essere considerato come una struttura di dati ad albero, è possibile utilizzare la trasformazione XBW per gli alberi, che è un'estensione della trasformazione Burrows-Wheeler per le stringhe.


1
Grazie per quello Ho solo un elenco / array JSON, non alcun oggetto JSON, quindi non vedo come possa essere considerato un albero. Potrei convertire le stringhe in un trie, ma poi non vedo come questo si collega alla trasformazione XBW.
Jayen,

4

Burrows - Wheeler Transform è un noto algoritmo di compressione che funziona riordinando i caratteri nella stringa da comprimere.


1
Grazie per quello, ma non sono sicuro di come posso usare queste informazioni. Voglio riordinare le stringhe nell'elenco da comprimere, ma non mi interessa se riesco a ripristinare l'ordine originale.
Jayen,

1

Per migliorare la compressione gzip, si desidera che stringhe "simili" siano vicine all'elenco. Esistono diversi modi per definire una simile somiglianza; lasciami descriverne uno ragionevole che funzioni bene nella pratica. Ricordiamo che la dimensione del blocco di gzip è 64 KB. Pertanto, i tuoi dati verranno suddivisi in blocchi di 64 KB byte e ogni blocco verrà compresso in modo indipendente. Per ottimizzare la compressione, è necessario ridurre al minimo il numero di k-mers distinti (sottostringhe di dimensione k) in ogni blocco. La motivazione è che tutte queste sottostringhe verranno sostituite con un identificatore.

Mentre il problema di cui sopra è difficile in teoria (è una variante del partizionamento ipergrafico), esistono algoritmi pratici veloci. Consiglierei il clustering simile a LSH che può essere implementato con un singolo passaggio sui dati. Si noti che l'ordinamento (in ordine alfabetico) è un altro modo per "raggruppare" stringhe simili insieme. Tuttavia, algoritmi di clustering specializzati possono offrire prestazioni migliori.

Un'alternativa è usare zstd , che è (i) più veloce, (ii) ottiene rapporti di compressione più alti e (iii) non ha limitazioni sulla dimensione del blocco (e quindi comprime le stringhe ugualmente bene indipendentemente dall'ordinamento dell'input).


0

Ho visto un algoritmo qualche tempo fa che forse può essere utile. Utilizza un algoritmo di modifica della distanza per calcolare la distanza tra ogni parola. Pertanto, crea un grafico in cui ciascun peso del bordo è questa distanza. Infine, ottiene un ordine scegliendo un percorso con la somma più bassa di pesi. Forse può migliorare gzip.


non sembra trattabile, ma se qualcuno lo prova, pubblica un commento con i tuoi risultati
Jayen,

Proverò a provarlo. Sono curioso di questo problema. Oltre a ciò, perché pensi che non sia trattabile?
Rafael Ribeiro,

per quanto ne so, modifica la distanza è O (nm), dove n e m sono il numero di lettere nella coppia di stringhe e devi farlo per ogni coppia di stringhe O (s ^ 2), quindi se n = m, questo è O (s ^ 2 * n ^ 2) che mi sembra intrattabile per 1,5 milioni di stringhe.
Jayen,

Oh, non mi preoccupavo molto della complessità perché pensavo che il tuo problema fosse ridurre solo le dimensioni binarie. Quindi questa operazione avverrà più spesso, giusto?
Rafael Ribeiro,

Stavo cercando qui e forse il costo di modifica della distanza può essere ridotto utilizzando automi levenshtein
Rafael Ribeiro
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.