トップページ⇒tech
992コメント329KB

【2ch】圧縮アルゴリズム【オリジナル】

■ このスレッドは過去ログ倉庫に格納されています
00011NGNG
おい、おまえら圧縮ソフト作ってみませんか?
中途半端に圧縮されて拡張子が.2ch
006358NGNG
>>62
何で?
006458NGNG
ネタをネタと見抜ける物でないと(略

鬱出汁脳。
0065デフォルトの名無しさんNGNG
ネット上にある、違法でない巨大ファイル(RedHatのISOなど)を利用して圧縮←遅いのでHDに一回DWN
([ISOと圧縮対象ファイル]の[同じデータ]を探してISOのデータアドレスをアーカイブに書く)
回答時はネットに接続して、ISO参照の部分だけISOから抜き取って解凍。
DQNだと思われなら無視なされて結構です。
0066デフォルトの名無しさんNGNG
>>65
なに言ってんだかさっぱりだけど
恒常性の無いデータなんか
使いモンにならんぞなモシ
0067デフォルトの名無しさんNGNG
>>65
DQN
どうせなら辞書鯖用意して巨大共通辞書ファイル置くってのはどうか。
0068デフォルトの名無しさんNGNG
>65
そのISOファイルへのポインタが消費するバイト数 >
ISOファイルを利用することによって節約できるバイト数

になる予感。
006967NGNG
用意するもの
・巨大鯖
・クライアント
・高速回線
ユーザがファイル圧縮を選択するとファイル内容が巨大鯖に転送されます。
……書いてて面倒くさくなってきたので続きはTHComp参照。
案外実現できそうな気がしない?
0070デフォルトの名無しさんNGNG
思い出した・・・この流れ・・・
昔導き出された結論はこうだ・・・
「インデックスのサイズが圧縮元のサイズと同じになる」
0071デフォルトの名無しさんNGNG
10年ほど前のある論文で、文字化された全世界の文章全てを圧縮すると
18GBに収まるってのがあった
この辞書を各クライアントが持つってのはどうかな?

当時は夢の容量だったから、だからどうしたレベルだったけど今ならいけそうだね
0072デフォルトの名無しさんNGNG
「文章」圧縮だけなら、それでもいいけどね。
0073デフォルトの名無しさんNGNG
>>57
BPEって特許からむのかな。
Cマガの記事は読んでないのでよく知らないけど、
セクションサイズを可変にするのはダメ?
255種類のByteが出現するまで読み込んで、
その中で最も多いペアを出現していない残りの1種類のByteに置き換える。
セクションのデリミタとしてもう1Byte予約しておかないとダメか。
007457NGNG
>73
俺もCマガの記事は読んだこと無いけどBPEの作者は特許取らない
ような事を言ってたらしいよ。

たしかBPEでは200種のByteが出てくるまで読みこんで(これを1ブロックとする)
その中から最多頻度のペアから順次残りの56種に割り当てて
圧縮していって圧縮が効かなくなるか256種使いきるまでやって
ペア表(軽く圧縮)・ブロックサイズ・圧縮データの組を順次出力してたと思う。

BPEが実際に使われた例は1しか知らないな。(除自作プログラム)
0075デフォルトの名無しさんNGNG
>>74
なるほど。そもそもブロックサイズは固定じゃなかったのか。
適当に前処理すれば圧縮率上がりそうな感じするね。
007657NGNG
こんな前処理を考えてみた。
 ブロックソーティング→ランレングス圧縮→BPE(Byte Pair Encoding)

※ランレングス圧縮を間にはさむのは、ブロックソートすると同値の連続が多くなり、
 それをそのままBPEするとその連続の個所で無駄にペアが消費されるから。

でも本当に圧縮率が上がるかどうかは不明(汗
0077デフォルトの名無しさんNGNG
RLE→BPE は太るよね。
それをやるなら普通に BWT→MTF→BPE なのかな。

BPEってもっと効率の良いブロックサイズを決定する方法がある気がする。
007857NGNG
>>77
>RLE→BPE は太るよね。

あ、RLEでビット単位の操作が入るようなのだとBPEは効きにくくなるな。
テキスト専用の圧縮にするなら0x00を長さ表示の開始コードに割り当てれば
実際の圧縮の場合は問題無いかも。
#それとも、まだ勘違いしてる?

>それをやるなら普通に BWT→MTF→BPE なのかな。

あと、ここ↓の2.14.15をみるとBWT→MTFよりMTF→BWTの方がいいみたい。
 http://www.ingnet.or.jp/~kojif/mu/comp/bwt.htm

>BPEってもっと効率の良いブロックサイズを決定する方法がある気がする。

このへんは良い方法思いつかないな。
以前自分で作った(拾ったコードを改変した)やつではデフォルトのパラメータ使ってたし。
0079デフォルトの名無しさんNGNG
> #それとも、まだ勘違いしてる?
BWT→RLEの時点で、前後のByte同士の関連は無くなってると思っただけです。

> あと、ここ↓の2.14.15をみるとBWT→MTFよりMTF→BWTの方がいいみたい。
「2.14.5 メモ」のこと?
そこに書いてある“MWT”ってのは何なのかわかんないけど、
BWT→MTFよりMTF→BWTの方がいいという意味では無いと思いますよ。

そこに書いてあるのは、BWT後のデータを効率よく圧縮する方法として、
まずMTFで0(ゼロ)を増やしてからZero-Runをかけると良いってな意味かと。
0080デフォルトの名無しさんNGNG
通常(未圧縮)の文書に MTF すると、サイズが大きくなることが多いよ。
0081デフォルトの名無しさんNGNG
>>71
現在、世界中のサーバに格納されているテキスト文書を
URIの形をインデックスの表現とすると考える。
このURIリストを圧縮することで、世界中の文書を圧縮できたと仮定する
これは、実際は間違いだが、下限値を記述することにはなる。

4億のサーバがあると仮定。各サーバが10文書持つと仮定。
URIの長さがIPアドレスの長さ4byteの2倍程度に圧縮できると仮定。

4億×10×8 = 29.8 GByte

結論: 18GBではとても無理だ!
0082デフォルトの名無しさんNGNG
>>81
まあ10年前なら18GBを楽に割りそう
ネット環境の発達が文書量のインフレを加速してますな
0083デフォルトの名無しさんNGNG
>>80
MTFかけただけならサイズは増えないだろ。
0084デフォルトの名無しさんNGNG
>>83
BWT->MTF->... よりも MTF->BWT->... の方が大きくなる場合が多いってことでは?
008557NGNG
>79
おれはMWTってのをBWTの誤植って解釈してた。
多分MTFのMとBWTのWTが混ざったんじゃないかな。

>84
Cで簡単なコード書いて試してみた。
Cのコード自身にそれぞれの変換をした結果をLZH(lh5)で圧縮して圧縮率を見たら
 無変換     41.1%
 BWT->MTF  14.1%
 MTF->BWT  19.2%
になった。

使い方
a.exe option input output
 option
  b BWT->MTF
  m MTF->BWT

制限
 入力ファイルは65536Byte以下

動作確認
 CYGWIN_98-4.10 名無し 1.3.12(0.54/3/2) 2002-07-06 02:16 i686 unknown
 gcc version 2.95.3-5 (cygwin special)

コンパイル
 gcc bwt_mtf.c -o bwt_mtf -Wall -O6

※30分で書いたコードだから間違いあるかも。

↓ソースをLZH圧縮&uuencodeしたもの。
begin-base64 644 bwt_mtf.lzh
RQAtbGg1LU4CAACbBQAA1hRpPSAC4ApNCwABQnd0TXRmLmMbAEGgjeqRXkzC
AQBPDntdTMIBAJhjFUhMwgEFAAALyAAAAe5ju9Gmo75yQ9/7tJtbThwBMeDB
SR8CyMi+dkITS23rjql7ht6hlYfG7//u60AIrFY+Bi5gNG0271oTJrrlPmqX
KhXp1Z7tzr4IqUJ8vsjl1ojYju3DproD63bgB7/V8IQyd/fjyGu3N+UliErB
Evn41I+lvePcvxko2PSKTUsNqkShBEYOXaN9ojSdddKQoPQTgLJGawOfEP3k
JSaoqYCFHi4hBULEJKLEdwK1O8hMp/PQMSaSe3Jo65iRQYtLEbIvZFIMNdnz
eFhBnxgEaYLZei68xLzXEwTKpeRDgygjMxOPC9edCRFJQajTCHYUBoaf72vT
pjha7kh+VSqVtkI1hcP6qZk6wPmsqt0PQ/h9Uw6sgTQTBfDDzgR1fKulaKFz
f6tC4o9Z9GLvycaomCfhXKT8xCLf0iBoMyJOUKf+VpIWSzlb1JsnY2TuIZ+L
WMNzPNJp9MMISPhHSeL4ufN/KlE7kguM/oERfK/1Ctp3uxoDg0mB3LCPKd/L
ykbAIFJ/atlSWiJCXi4RU+UhnZawD02ujL2e33esIEJ2GCBVa/vmJwrg7DZ2
JkzxCOYMb9hvhdYIQuEaS7DpJi26MQx11Ux9TY9IFFcNE5SzmMGExbxlfbY1
hmk1qqO87uxz3IXJqeZGw0JswYiqOHbR2+AdzMQb+ccrQg7m0jLFJg/w1cBm
6H4SW2faIxtERa7+cQW0R/T5+ya0RlPNFXrX4NTiKyqBKl6h8ftovxp9bcob
E86h4yqHusqHNupQs9tPm7ci5c6fu78cGMFmDAAA
====
0086デフォルトの名無しさんNGNG
>>85
> おれはMWTってのをBWTの誤植って解釈してた。
大丈夫、大抵の奴はそう思うから。

MTF->BWTの逆にするとサイズが大きくなるのは有名な話だとおもてた。
少なくとも圧縮に関する研究や職業ならMTFがどういうものか知てるので。
0087デフォルトの名無しさんNGNG
>>86
有名な話だと思ってたってことはどっかに解説でもある?
検索してもBWT->MTFしかでてこない。
むしろ↑これが有効なことの方が有名な気がする。

MTFがどういうものかってのは…まんまの認識じゃあまいってことなのか
MTF程度にどうもこうもないと思うんだが(煽りとちゃいますよ)
0088デフォルトの名無しさんNGNG
圧縮について語るなら、たとえば
ttp://www.hn.is.uec.ac.jp/~arimura/compression_papers.html
にリストアップされてるような論文が理解できないとだめだよね。

ttp://www.ingnet.or.jp/~kojif/mu/comp/bwt.htm
あたりの入門用の解説を読んでもたいしたことは書いてない。
0089デフォルトの名無しさんNGNG
あらかじめ辞書データを登録しておけばなんとかなりそうだね。
本体はでかくなるが。
0090デフォルトの名無しさんNGNG
sage
0091デフォルトの名無しさんNGNG
おりじなるぅ
0092デフォルトの名無しさんNGNG
俺はどんなファイルでも圧縮できるソフト作ったぞ。
0093デフォルトの名無しさんNGNG
2ch圧縮プログラム用辞書には"DQN"、"オマエモナー"、"逝ってよし"などの単語を
登録すれば宜しいか。
0094デフォルトの名無しさんNGNG
>>92
それが本当なら今すぐ特許を取れ。
0095デフォルトの名無しさんNGNG
>>93
実際そんなに使われていない罠
009657NGNG
板毎に上位30スレぐらい取ってきて単語の頻度調べてハフマンコード表作って、
それを初期状態とした動的ハフマン使ったら結構圧縮きくかも。

# 眠い頭で考えたからツッコミ歓迎。
0097デフォルトの名無しさんNGNG
>>92
全てのファイルを1バイト以下にできるということだな?
0098デフォルトの名無しさんNGNG
>>92
すべてのファイルを1ビット未満にできると!?
0099デフォルトの名無しさんNGNG
>>98
1ビット未満ってことは0だな?


それはさておき,少し前にランダムデータに対して圧縮できるって話出てたけど
あれはどうなったんだろう。
0100デフォルトの名無しさんNGNG
>>99
1ビット未満は即0ではないのだが・・・まぁいいや。
再帰的に繰り返せば同じことだから。

>それはさておき,少し前にランダムデータに対して圧縮できるって話出てたけど
消えたのではなかろうか。
http://www.zeosync.com/ が404エラーになる。
0101デフォルトの名無しさんNGNG
>>100
無知で申し訳無いんだが,今のコンピュータでビットより高い分解能の単位は表現できるの?
(日本語おかしいかも知れんが許してくれ)
0102デフォルトの名無しさんNGNG
0.7 bit x 10 個 なら 7 bit だろ。
0103デフォルトの名無しさんNGNG
>>102
あ,要するに

7ビット中に10個のファイルの内容を格納する

という意味でつね?納得しますた。
0104デフォルトの名無しさんNGNG
>>103
まぁ算術符号なんかは実直にその概念を実装したものなわけだ。小数ビットの。
一方、ZLなんかも見た目は違うけど、実態は同じ。
0105デフォルトの名無しさんNGNG
>>96
誤解してるのかもしれないが、何故動的ハフマンを使う必要が・・。
別にストリームで圧縮するわけじゃないでしょ?
0106デフォルトの名無しさんNGNG
圧縮率は高いけど
もの凄く処理時間がかかって現段階では実用にならない
アルゴリズムってあるの?
0107デフォルトの名無しさんNGNG
>>106
全てのファイルが1〜十数バイトになるってのが昔あったよ(w
0108デフォルトの名無しさんNGNG
>>106
円周率圧縮
0109?NGNG
>>107
まじ?
それって、シャノンの情報理論とかに反してない?
0110デフォルトの名無しさんNGNG
>>109
 この宇宙で存在しうる全てのデータにインデックスを付けるとしても、せいぜい256bitもあれば十分です
は真でも、全てのデータを256bitに圧縮出来るというのは別の話です。

よく勘違いする人がいるので気をつけましょう
0111デフォルトの名無しさんNGNG
>>108
円周率の数列から目的のデータを検索して
その出現位置でデータを表すってこと?
0112デフォルトの名無しさんNGNG
おまえら、AAに特化ってんだから既存のAAを数百種類プログラムに内蔵させて
それとの差分のみを圧縮すればいいだろ?

シャノンの情報理論に基づきデータの偏りを均一化するんだ。
0113105NGNG
ああ、テーブルを持ちたくないってことか。すまぬ。
0114デフォルトの名無しさんNGNG
>>113
初期状態のハフマンコード表を作るって言ってるんで、それは違うんじゃない?
あくまで推測ですが、動的ハフマンなら出現頻度の偏りの変化に追従できるから
高圧縮になると考えているのではないかと思われ。
0115デフォルトの名無しさんNGNG
MTFがどういうものかってのは…まんまの認識じゃあまいってことなのか
MTF程度にどうもこうもないと思うんだが(煽りとちゃいますよ)
0116デフォルトの名無しさんNGNG
>>109
あと復号方法も考慮に入れてません(アカシックレコードが必要)
0117デフォルトの名無しさんNGNG
>>115
MTFは情報源の特性(無記憶とか定常とか)によって左右されるから気をつける。
最近、EffrosらによってBWTの冗長度が理論的に証明されたけど、
そこではMTFについてかなり細かく(実はそうでもないが)分析がされてたよ。
0118デフォルトの名無しさんNGNG
円周率使用したって、圧縮にはらなんだろw
0119デフォルトの名無しさんNGNG
>>111 それだと逆に増えそう・・・
0120デフォルトの名無しさんNGNG
じゃあ円周率のほかにexp(素数)も使ってくれ
0121デフォルトの名無しさんNGNG
public: searchBit()
 if (assyukuPattern == 0) {
  int i;
  while(searchPI(i++))
   ;
 } else {
  int j;
  long sosuu;
  while((long = getSosuu(j++)) != 0)
   int i;
   while(searchExp(i++, Sosuu)
    ;
  }
  put("ok");
}

private: getSosuu() {
//preaseWrite
}

private: searchPI() {
//preaseWrite
}

private: searchExp() {
//preaseWrite
}
0122デフォルトの名無しさんNGNG
>>119
圧縮可能だったら、圧縮するんだよ。無理ならやらなければいい。
それにたとえ確立が低くても、LZHやZIPが圧縮できたら神だろ?
0123デフォルトの名無しさんNGNG
>>121
素数は http://pc3.2ch.net/test/read.cgi/tech/1018657457/ に頼め
0124デフォルトの名無しさんNGNG
擬似コード

long searchBit(bit* data, long assyukuPattern)
//とにかく探す
 int i;
 if (assyukuPattern == 0) {
  searchPI(i++);
 } else {
  searchExpSosuu(&data, i++, assyukuPattern)
 }
 return i;
}

long searchPI(bit* data, long offset) {
//PIを検索する
}

long searchExpSosuu(bit* data, long offset, long sosuuno) {
//expSosuuを検索する
}

long expSosuu(long n) {
//getSosuuで取得した素数を(1/2)乗し、PIと同じく無限小数化する
}

long getSosuu(long n) {
//n番目の素数を返す(もちろんテーブルを引く)
}

0125デフォルトの名無しさんNGNG
作れ
0126デフォルトの名無しさんNGNG
>>119
> それにたとえ確率が低くても、LZHやZIPが圧縮できたら神だろ?
限りなく低いので却下
0127デフォルトの名無しさんNGNG
>>114
いや、だから初期状態のテーブルはプログラム側でもって、圧縮したファイルには
入れないんでしょう。
0128デフォルトの名無しさんNGNG
URRって圧縮には使えないのかな?
0129デフォルトの名無しさんNGNG
>>119
PPMZとかで再圧縮した方がはるかに縮みそうだ。

>>128
URR って「万能数値表現法」のこと?
ちょっと資料読んでみたけど、算術符号や、(二分)木による数値圧縮法、
などが近い考えなのではないかとふとおもた。
0130デフォルトの名無しさんNGNG
っていうかプログラムがローマ字なのに萎えた
0131デフォルトの名無しさんNGNG
円周率、素数とか言ってる奴は間違いなく偏差値40以下の高卒(藁

圧縮可能ならと言ってるが、その情報を付加するんだから情報量は基本的に増える
ことになるんだよ。円周率やら素数やら増やせば増やすほどな
それらのパターンを増やし、全ての情報パターンを表せるようになったときに
圧縮前のデータとおなじビット数が必要になることに気がつくんだよ(藁

くだらんこと言ってないで確率統計でもやってろ痴呆
0132デフォルトの名無しさんNGNG
口は悪いがまったく131の言うとおりだ
0133デフォルトの名無しさんNGNG
今日は自作自演が多いですね。
0134デフォルトの名無しさんNGNG
>>131
ネタにマジレスするなよ…
0135デフォルトの名無しさんNGNG
>>134
オマエモナー
0136デフォルトの名無しさんNGNG
もう現在の圧縮率で限界近いからな
あとがんばっても5%も減らないだろ
0137デフォルトの名無しさんNGNG
シャノンのどうたらってやつ?
でも、BWTはアレを無視した手法強引にエントロピーを低下させてるんでしょ?
0138デフォルトの名無しさんNGNG
どーでもいいけど非可逆圧縮でいいんじゃない?
圧縮くわしくないけどさ
とくに2chのログなんてかなり省略できると思う

↑を圧縮


非可逆圧縮でよくない?
圧縮シラネーヨ
特に2chのログナンテカナリ省略デキルサ

0139デフォルトの名無しさんNGNG
>>138
下のやつを展開するとどうなるんですか?
0140デフォルトの名無しさんNGNG
ヤパーリ、2ch専用の圧縮形式なんだから2chの性質を使わないとな〜。

人工無能を搭載してありがちな反応を数パターン予測して、
その中から一致するパターンがあればそのパターン番号を出力、
失敗したら通常の圧縮って手もあるな。

つまり、擬似コードで書くとこんな感じな。

void 圧縮(前レス, レス) {
 array= 人工無能(前レス);
 for(i=0; i< array.size; i++) {
  if(レス== array[i]) {
   出力(i);
   (・∀・)カエレ!;
  }
 }
 出力(予測シパーイ);
 出力(通常圧縮(レス));
 (・∀・)カエレ!;
}
0141デフォルトの名無しさんNGNG
やっぱ2ch独特の定型文をテーブルで持つのが良いのでは.
この場合,圧縮率の高いスレは内容の少ない糞スレである確率が高い.
0142デフォルトの名無しさんNGNG
>>141
 原文と一緒に圧縮して何%圧縮出来たかで 作者が同一か判定するというのがあったけど
 圧縮率でクソスレ率を出すのも面白いかもね。

0143デフォルトの名無しさんNGNG
>>137
ワラタ。むちゃくちゃ言うなよ。
エントロピーとエントロピーレートは似て非なるもの。
0144思いつきおとこNGNG
「あいうえおかきくけこさしすせそたちつてと」
 を
「とてつちたそせすしさこけくきかおえういあ」
 の反対と見るようなロジックってありました?
0145デフォルトの名無しさんNGNG
とりあえず圧縮して「.2ch」になれば圧縮比なんてどうでもいいって。
つーかlzhでいいです。
0146デフォルトの名無しさんNGNG
>>145
よくないです・・・・・lzhが拡張子だと、デフォルトではunlhaの方に渡されちゃうよ。
0147デフォルトの名無しさんNGNG
>>146
そりゃ環境依存だ。うちではlzhには何の関連付けもしていない。
unixだと関係ないしな〜
0148デフォルトの名無しさんNGNG
>>147
まぁ結局そうなんですが、やはり.lzhは避けた方がいいのでは。
0149 NGNG
あのさ、サーバーでごみのようにあるdatをlzhで圧縮すると
負荷がかかりまくるでしょうが。
単純にhttp://をEsc文字 <a href= を \
アラーム文字 とかでいいと思うんだけどなー
0150デフォルトの名無しさんNGNG
>>149
あふぉだな
そんなくだらんことしないでgzipしたほうが圧縮率あがるんだよヴォケ
殆どgzipで転送してんだからくだらん加工してサーバーに余計な負荷かけるな史ね
0151デフォルトの名無しさんNGNG
ダウソ症の>>150がいるスレはここですか?
0152デフォルトの名無しさんNGNG
>>150
うわー、おっかなーい。藁
0153デフォルトの名無しさんNGNG
>>150
はいはい。怖い怖い。
ぶるぶる〜



藁
0154 NGNG
いや、まじめに考えようYO!
0155デフォルトの名無しさんNGNG
>>151=>>152=>>153
0156デフォルトの名無しさんNGNG
>>155
151と152と153を同一フレーズに圧縮したら非可逆になっちまうだろうが。
まあ展開結果は「クソレス3件」だけでも構わんがな。
0157デフォルトの名無しさんNGNG
>>156
真面目に考えんなYO。
つーか思いついた。
2ch語を特定の数字に置き換えんの。
1,オマエモナー 2,YO 3,逝ってよし 4,1よ 5,藁・・・・・(2ch語続く)

だれか作ってくださいお願いします。,5,
0158デフォルトの名無しさんNGNG
>>157
>>95
0159デフォルトの名無しさんNGNG
どうやら小学生がいるな。
特定の文字を数字にしたら
今度は数字を符号化しないといけなくなるじゃん。
0160不マジレスNGNG
予約語が256個あって、1バイトで置き換え。
それ以外は原文字のままで1バイトずつ。
で、それら8個集めて別のフラグバイトにどっちかを示すビットを立てていく。
0161デフォルトの名無しさんNGNG
>>160
全部 9bits にするぐらいなら予約語を escape した方が縮むんじゃ…
よっぽど頻繁に出てくればともかく、平文が 9/8 に膨らむと大きそう。
0162デフォルトの名無しさんNGNG
>>155
お前は自作自演を見破れないのか?
■ このスレッドは過去ログ倉庫に格納されています