短いテキスト文字列の効率的な圧縮アルゴリズム[終了]


126

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


1
これらの圧縮文字列をどこで使用しますか?
ガンボ

1
これはtinyurlsストレージスペースに向かっているのでしょうか?
nik

6
URLを圧縮するアルゴリズムに興味があります。最高の圧縮率がランニングコストよりも重要です。tinyurlsやtr.imなどのオンラインサービスには興味がありません。サービスではなくアルゴリズムを探しています。他の情報が役に立つとは思わないでください...
Vasily Korolev

3
@ガンボ:アルゴを見つけるには「短い文字列のテキスト圧縮アルゴリズム」で十分ですが、なぜそれらが何のためにあるのかを知りたいと思っているのですか?OPは、彼が望むことを行うものを見つけることができると確信しています。
ダービンサンク

7
@Vasily、小さなヒント:あなたは「何がある、の形でSOの質問をしているときはいつでも最高の?XYZ」最善を求めてするので、あなたの質問はほとんど閉鎖するための投票を受け取るためにバインドされているかもしれない不必要な製品につながります比較、または最悪の場合は、炎の戦争さえ。(通常、それを回避するための変更はごくわずかです。「XYZを提案してください。」などの同じ質問をした場合、基本的に同じ質問ですが、最終投票数はそれほど多くありません!)
stakx -

回答:


62

Smazをチェックしてください

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


17
github.com/antirez/smaz/blob/master/smaz.cを参照してください-これはコーディング自体の変形であり、圧縮自体ではありません(少なくとも完全にではありません)。彼は静的な単語と文字の辞書を使用しています。
ロイティンカー、

7
注:これはantirezのプロジェクトです。彼はRedisの主要な作者の1人であり、高品質の製品コードをリリースすることで非常に高い評価を得ています。
Homer6、2014年

7
smazアルゴリズムは英語のテキスト用に最適化されているため、ランダムな文字列に対してはうまく機能しません。ここではいくつかのサンプル(あるstring:orig_size:compr_size:space_savings:) 、This is the very end of it.:27:13:52%Lorem ipsum dolor sit amet:26:19:27%Llanfairpwllgwyngyll:20:17:15%、、aaaaaaaaaaaaa:13:13:0%2BTWm6WcK9AqTU:14:20:-43%XXX:3:5:-67%
mykhal

4
また、圧縮率は低くても高速なアルゴリズムshoco ed-von-schleck.github.io/shoco
Dickey Singh

私のライブラリUnishoxをリストgithub.com/siara-cc/unishoxに追加します。SmazやShocoよりもパフォーマンスが高く、UTF-8文字列の圧縮をサポートしています。
アルン

28

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

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

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

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

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


4
すべてのファイルのハフマンテーブルが同じである場合は、ファイルがすべて類似している場合に意味があります。
finnw 2009

1
多くの類似した小さなファイルがある場合、それはすべて間違っています。まず、(tarのように)それらをすべて連結し、それを圧縮します。圧縮率が向上し、問題は「50〜1000バイト」でなくなります。
ダニエルC.ソブラル

8
@Daniel:圧縮データへのランダムアクセスが必要かどうかによって異なります。それをすべて一緒に圧縮すると、ほとんどの圧縮システムでそれが防止されます。
スティーブジェソップ

22

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

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

このアルゴリズムは優れた圧縮率を提供しませんが、メモリとCPUリソースを非常に節約し、データの連続ストリームで動作することもできます-解凍器は解凍するときにルックアップテーブルの独自のコピーを保持するため、ルックアップテーブル圧縮されるデータのタイプに調整します。


しかし、予測子は通常の英語の文でどのように動作しますか?与えられた例には非常に強い冗長性があり、ゲインは最小限です。
ダヌビアンセーラー2015

256 * 256ルックアップテーブルは、「メモリが非常に質素」であるように聞こえません...!
MikeW 2017

@MikeWええとそれは65キロバイトです。
redcalx 2017

@redcalxそれが65バイトであったなら、私は同意したかもしれません!
MikeW 2017

11

プリセット辞書をサポートする任意のアルゴリズム/ライブラリー、例えばzlib

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

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

ただし、URLの場合、特定の文字列(「http:// www。」、「。com」、「。html」、「。aspx」は通常、各入力ファイルに一度だけ表示されます。したがって、ファイル間で共有する必要がありますファイルごとに1つの圧縮オカレンスを持つのではなく、プリセット辞書に配置することでこれを実現できます。


2
カスタム辞書の使用に関するヒント:stackoverflow.com/questions/2011653
Trenton


4

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

ウィキペディアには、圧縮時間のリストがあります。(効率の比較を探す)

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

6
彼はファイルではなくテキストを圧縮したいと考えています。
ガンボ

3
これらのアルゴリズムを使用して、テキストとバイナリを圧縮できます。実際、Pythonで実行されるcmsシステム内でdeflateを使用しています。
ライアンクリステンセン

文字列にgzipを使用するC#の例は次のとおり
Ryan Christensen

文字列を圧縮するためのPythonのzlibモジュール:python.org/doc/2.5.2/lib/module-zlib.html
Ryan Christensen

3
gzip(およびzlib)は、deflateを使用し、ラッパー/フレーミングオーバーヘッドを追加します。直接deflate / LZ77(辞書のオーバーヘッドと効率は、依然としてそのような設定の設定に依存します)は、損益分岐オーバーヘッドを削減できます。もちろん、これは数十から数百文字の「短い」文字列用です(データの拡大を避けるために、「これは圧縮されたか」を示すビットがまだあるはずです)。テキストが増えても、余分なオーバーヘッドが大きくてもかまいません。ここに掲載されている数値は、大きなテキストファイル(実行に数秒!)の場合のようですが、OPは50〜1000のチャーターを要求します- 比較すると非常に小さいです。
user2864740 2018年

2

あなたは見てとることもできますUnicodeの標準圧縮スキーム

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


SCSUは、UTF-16 / MBエンコーディングで英語以外のUnicodeを「圧縮」します。...もし英語ベースのUnicode /プレーン古い-ASCII、UTF-8もUTF-16の'圧縮' 50%
user2864740
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.