圧縮のために最適化するためにデータを並べ替えるアルゴリズムはありますか?これはデータと圧縮アルゴリズムに固有のものであると理解していますが、このトピックに言葉はありますか?この分野の研究はどこで見つけることができますか?
具体的には、150万文字列のjsonリストがあり、gzip(HTTP用)圧縮が最適化されるように文字列を並べ替えたいと思います。文字列の並べ替えは非常にうまくいきますが、それが最適かどうかはわかりません。
圧縮のために最適化するためにデータを並べ替えるアルゴリズムはありますか?これはデータと圧縮アルゴリズムに固有のものであると理解していますが、このトピックに言葉はありますか?この分野の研究はどこで見つけることができますか?
具体的には、150万文字列のjsonリストがあり、gzip(HTTP用)圧縮が最適化されるように文字列を並べ替えたいと思います。文字列の並べ替えは非常にうまくいきますが、それが最適かどうかはわかりません。
回答:
これは、Navin Goyalの回答への追加です。
JSONファイルはツリーデータ構造と見なすことができるため、ツリーのXBW-transformを使用できます。これは、文字列のBurrows-Wheeler変換の拡張です。
バロウズ-ウィーラー変換は、圧縮される文字列内の文字を並べ替えることによって機能するよく知られた圧縮アルゴリズムです。
gzip圧縮を改善するには、「類似の」文字列をリスト内で近くにする必要があります。このような類似性を定義する方法はいくつかあります。実際にうまく機能する合理的なものを説明させてください。gzipのブロックサイズは64Kであることを思い出してください。したがって、データは64Kバイトのブロックに分割され、すべてのブロックが独立して圧縮されます。圧縮を最適化するには、すべてのブロックで個別のk-mer(サイズkの部分文字列)の数を最小限に抑える必要があります。動機は、そのようなすべての部分文字列が識別子に置き換えられることです。
上記の問題は理論上は難しいですが(ハイパーグラフパーティション分割の変形です)、高速で実用的なアルゴリズムが存在します。データを1回渡すだけで実装できるLSHのようなクラスタリングをお勧めします。(アルファベット順)ソートは、類似した文字列を「クラスター化」する別の方法であることに注意してください。ただし、特殊なクラスタリングアルゴリズムの方がパフォーマンスが向上する場合があります。
別の方法は、zstdを使用することです。これは、(i)より高速で、(ii)より高い圧縮率を取得し、(iii)ブロックサイズに制限がありません(したがって、入力順序に関係なく文字列を同様に圧縮します)。
少し前に、おそらく役に立つかもしれないアルゴリズムを見ました。編集距離アルゴリズムを使用して、各単語間の距離を計算します。したがって、各エッジの重みがこの距離であるグラフを作成します。最後に、重みの合計が最小のパスを選択する順序を取得します。たぶん、gzipを改善できるでしょう。