web-dev-qa-db-ja.com

短いテキスト文字列のための効率的な圧縮アルゴリズム

私は小さなテキスト文字列を圧縮するアルゴリズムを探しています:50-1000バイト(つまりURL)。これに最適なアルゴリズムはどれですか?

115
Vasily Korolev

チェックアウト Smaz

Smazは、非常に短い文字列の圧縮に適したシンプルな圧縮ライブラリです。

57
stvchu

ハフマンには静的なコストであるハフマンテーブルがあるため、これは良い選択ではないことに同意しません。

これを排除する適応バージョンがありますが、圧縮率が低下する可能性があります。実際、あなたが尋ねるべき質問は「これらの特性を持つテキスト文字列を圧縮するアルゴリズム」です。たとえば、長い繰り返しが予想される場合、単純なRun-Lenghエンコードで十分です。英語の単語、スペース、句読点、および時折の数字のみが存在することを保証できる場合は、事前に定義されたハフマンテーブルを持つハフマンが良い結果をもたらす可能性があります。

一般に、Lempel-Zivファミリーのアルゴリズムは非常に優れた圧縮とパフォーマンスを備えており、それらのライブラリが豊富にあります。私はそれで行きます。

圧縮されているのはURLであるという情報があれば、圧縮する前に(簡単に利用できるアルゴリズムで)、それらを修正することをお勧めします。 URLは明確に定義されたパターンに従い、その一部は高度に予測可能です。この知識を活用することで、URLを最初からより小さなものに体系化することができ、ハフマンエンコーディングの背後にあるアイデアがここで役立ちます。

たとえば、URLをビットストリームに変換する場合、「http」をビット1に、その他をビット「0」に続けて実際のプロコトールを置き換えることができます(またはテーブルを使用して、httpsなどの他の一般的なプロトコルを取得し、 ftp、ファイル)。プロトコルの終了をマークできる限り、「://」は完全に削除できます。他のURL形式について読んで、スペースを節約するためにどのようにコード化できるかを考えてください。

28

手元にコードはありませんが、サイズ256 * 256文字の2Dルックアップテーブルを構築するアプローチが常に好きでした( RFC 1978PPP Predictor Compressionプロトコル)。文字列を圧縮するには、各文字をループし、ルックアップテーブルを使用して、現在および前の文字をテーブルのインデックスとして使用して、「予測された」次の文字を取得します。一致する場合は1つの単一ビットを書き込み、そうでない場合は0の文字を書き込み、現在の文字でルックアップテーブルを更新します。このアプローチは基本的に、データストリーム内で最も可能性の高い次の文字の動的な(そして粗雑な)ルックアップテーブルを維持します。

ゼロ化されたルックアップテーブルから開始できますが、英語など、各文字ペアの最も可能性の高い文字で初期化されている場合は、明らかに非常に短い文字列で最適に機能します。初期ルックアップテーブルが圧縮と解凍で同じである限り、圧縮データに出力する必要はありません。

このアルゴリズムは素晴らしい圧縮率を提供しませんが、メモリとCPUリソースで信じられないほど質素であり、データの連続ストリームで動作することもできます-圧縮解除プログラムは、解凍するルックアップテーブルの独自のコピー、つまりルックアップテーブルを保持します圧縮されるデータのタイプに調整します。

22
redcalx

プリセット辞書をサポートするアルゴリズム/ライブラリ。 zlib

このようにして、入力に表示される可能性が高い同じ種類のテキストでコンプレッサーを準備できます。ファイルが何らかの方法で類似している場合(たとえば、すべてのURL、すべてのCプログラム、すべてのStackOverflow投稿、すべてのASCIIアート図面)、特定のサブストリングがほとんどまたはすべての入力ファイルに表示されます。

1つの入力ファイルで同じ部分文字列が複数回繰り返される場合、すべての圧縮アルゴリズムがスペースを節約します(たとえば、英語テキストの「the」またはCコードの「int」)。

ただし、URLの場合、特定の文字列(たとえば、「 http:// www 。」、「.com」、「.html」、「.aspx」は各入力ファイルに1回表示されます。したがって、ファイルごとに1つの圧縮オカレンスを作成するのではなく、何らかの方法でファイル間でそれらを共有する必要があります。

11
finnw

Deflate/gzip(gzipのラッパー)を短縮するだけでなく、実際にテキストを圧縮することについて話している場合、Zipは小さなファイルやテキストに適しています。他のアルゴリズムは、bzip2などの大きなファイルに対して非常に効率的です。

Wikipedia には圧縮時間のリストがあります。 (効率の比較を探す)

Name       | Text         | Binaries      | Raw images
-----------+--------------+---------------+-------------
7-Zip      | 19% in 18.8s | 27% in  59.6s | 50% in 36.4s
bzip2      | 20% in  4.7s | 37% in  32.8s | 51% in 20.0s
rar (2.01) | 23% in 30.0s | 36% in 275.4s | 58% in 52.7s
advzip     | 24% in 21.1s | 37% in  70.6s | 57& in 41.6s
gzip       | 25% in  4.2s | 39% in  23.1s | 60% in  5.4s
Zip        | 25% in  4.3s | 39% in  23.3s | 60% in  5.7s
5

ハフマンコーディング 通常、これで問題ありません。

3
Zifre

nicodeの標準圧縮スキーム をご覧ください。

SQL Server 2008 R2は内部で使用し、最大50%の圧縮を実現できます。

2
Le Hibou