Apakah ada algoritma untuk menata ulang data untuk mengoptimalkan kompresi? Saya mengerti ini khusus untuk data dan algoritma kompresi, tetapi apakah ada kata untuk topik ini? Di mana saya dapat menemukan penelitian di bidang ini?
Secara khusus, saya memiliki daftar json berisi 1,5 juta string, dan saya ingin menyusun ulang string sehingga kompresi gzip (untuk HTTP) dioptimalkan. Menyortir string tidak cukup baik, tetapi saya tidak benar-benar tahu apakah itu optimal.
optimization
permutations
Jayen
sumber
sumber
Jawaban:
Ini adalah tambahan untuk jawaban Navin Goyal.
Karena file JSON dapat dianggap sebagai struktur data pohon, Anda dapat menggunakan XBW-transform untuk pohon, yang merupakan perpanjangan dari transformasi Burrows-Wheeler untuk string.
sumber
Burrows - Transformasi Wheeler adalah algoritma kompresi terkenal yang bekerja dengan menyusun ulang karakter dalam string yang akan dikompresi.
sumber
Untuk meningkatkan kompresi gzip, Anda ingin string "mirip" berada dekat dalam daftar. Ada sejumlah cara untuk mendefinisikan kesamaan tersebut; biarkan saya menggambarkan yang masuk akal yang bekerja dengan baik dalam praktik. Ingat bahwa ukuran blok gzip adalah 64K. Dengan demikian, data Anda akan dibagi menjadi blok-blok 64K byte dan setiap blok akan dikompresi secara independen. Untuk mengoptimalkan kompresi, kita perlu meminimalkan jumlah k-mers yang berbeda (substring ukuran k) di setiap blok. Motivasinya adalah bahwa semua substring tersebut akan diganti dengan pengenal.
Sementara masalah di atas sulit secara teori (ini adalah varian dari partisi hypergraph), ada algoritma praktis yang cepat. Saya akan merekomendasikan pengelompokan seperti LSH yang dapat diimplementasikan dengan sekali lewati data Anda. Perhatikan bahwa penyortiran (menurut abjad) adalah cara lain untuk "mengelompokkan" string yang sama menjadi satu. Namun, algoritma pengelompokan khusus dapat berkinerja lebih baik.
Alternatifnya adalah dengan menggunakan zstd , yang (i) lebih cepat, (ii) memperoleh rasio kompresi yang lebih tinggi, dan (iii) tidak memiliki batasan pada ukuran blok (dan dengan demikian, kompres string sama baiknya terlepas dari pemesanan input).
sumber
Saya melihat suatu algoritma beberapa waktu lalu yang mungkin bisa bermanfaat. Ini menggunakan algoritma edit jarak untuk menghitung jarak antara setiap kata. Dengan demikian, itu membangun grafik yang masing-masing berat tepi jarak ini. Akhirnya, ia mendapat pesanan memilih jalur yang memiliki jumlah bobot terendah. Mungkin itu bisa meningkatkan gzip.
sumber