データ(文字列のセット)を並べ替えて圧縮を最適化しますか?


12

圧縮のために最適化するためにデータを並べ替えるアルゴリズムはありますか?これはデータと圧縮アルゴリズムに固有のものであると理解していますが、このトピックに言葉はありますか?この分野の研究はどこで見つけることができますか?

具体的には、150万文字列のjsonリストがあり、gzip(HTTP用)圧縮が最適化されるように文字列を並べ替えたいと思います。文字列の並べ替えは非常にうまくいきますが、それが最適かどうかはわかりません。


1
gzip圧縮(スライディングウィンドウが小さいLZ77)の文字列の最適な並べ替えは、NP困難な問題のように聞こえます。おそらく、最も短い一般的なスーパーストリング問題からの削減を思いつくことができます。
ジョウニシレン

@JouniSirén最短の共通スーパーストリングは、共通部分を背中合わせに制限するので、最長共通サブストリングがより良いアプローチだと思いますか?NPが扱いやすい限りは気にしません(最新のマシンで実行するのに1日かかるなど)。
ジェイエン

回答:


6

これは、Navin Goyalの回答への追加です。

JSONファイルはツリーデータ構造と見なすことができるため、ツリーのXBW-transformを使用できます。これは、文字列のBurrows-Wheeler変換の拡張です。


1
ありがとう。JSONリスト/配列のみがあり、JSONオブジェクトはありません。そのため、ツリーとみなす方法がわかりません。文字列をトライに変換できましたが、これがXBW変換にどのように関係するかわかりません。
ジェイエン


1

gzip圧縮を改善するには、「類似の」文字列をリスト内で近くにする必要があります。このような類似性を定義する方法はいくつかあります。実際にうまく機能する合理的なものを説明させてください。gzipのブロックサイズは64Kであることを思い出してください。したがって、データは64Kバイトのブロックに分割され、すべてのブロックが独立して圧縮されます。圧縮を最適化するには、すべてのブロックで個別のk-mer(サイズkの部分文字列)の数を最小限に抑える必要があります。動機は、そのようなすべての部分文字列が識別子に置き換えられることです。

上記の問題は理論上は難しいですが(ハイパーグラフパーティション分割の変形です)、高速で実用的なアルゴリズムが存在します。データを1回渡すだけで実装できるLSHのようなクラスタリングをお勧めします。(アルファベット順)ソートは、類似した文字列を「クラスター化」する別の方法であることに注意してください。ただし、特殊なクラスタリングアルゴリズムの方がパフォーマンスが向上する場合があります。

別の方法は、zstdを使用することです。これは、(i)より高速で、(ii)より高い圧縮率を取得し、(iii)ブロックサイズに制限がありません(したがって、入力順序に関係なく文字列を同様に圧縮します)。


0

少し前に、おそらく役に立つかもしれないアルゴリズムを見ました。編集距離アルゴリズムを使用して、各単語間の距離を計算します。したがって、各エッジの重みがこの距離であるグラフを作成します。最後に、重みの合計が最小のパスを選択する順序を取得します。たぶん、gzipを改善できるでしょう。


それは扱いにくいように思えますが、誰かがそれを試してみたら、あなたの結果にコメントを投稿してください
Jayen

テストしてみます。この問題に興味があります。それに加えて、なぜそれが扱いにくいと思いますか?
ラファエルリベイロ

私が知る限り、編集距離はO(nm)です。nとmは文字列のペアの文字数であり、文字列のすべてのペアO(s ^ 2)に対してこれを行う必要があるため、n = m、これはO(s ^ 2 * n ^ 2)で、150万文字列では私には難解です。
ジェイエン

ああ、私はあなたの問題はバイナリサイズのみを減らすことだと思ったので、それほど複雑さを気にしませんでした。したがって、この操作はより頻繁に発生しますよね?
ラファエルリベイロ

ここで検索していたので、編集距離のコストは、レーベンシュタインオートマトンを使用して削減できる可能性があります
ラファエルリベイロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.