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

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

レス数が900を超えています。1000を超えると表示できなくなるよ。
00011NGNG
おい、おまえら圧縮ソフト作ってみませんか?
中途半端に圧縮されて拡張子が.2ch
0809デフォルトの名無しさんNGNG
>>806
アルゴリズムが同じでも、コーディング能力によって倍くらいコード長が違う。
ま、>>795,>>808と同じでいまさらBWTがどうしたなんかどうでもいいが。
0810デフォルトの名無しさんNGNG
「実質〜行」なんていう言い訳は見飽きたから、
さっさと30行で書いて見せろっつーの。
0811デフォルトの名無しさんNGNG
>>810
7行プログラミングスレにありましたよ
0812デフォルトの名無しさんNGNG
>>811
圧縮できる完動品が?
0813デフォルトの名無しさんNGNG
>>812
MTFとレンジエンコーダーもあるから、自分で組み合わせてみたら。

つーか、そもそもの発言は符号化までは含まない単体のBWTについてだったのでは?
0814デフォルトの名無しさんNGNG
あのな。540から延々「実際に圧縮できる」限定ソート(もどき)の
話してて、実際に完動するソースが出てて、
ソースのサイズ比べる話が出て、なんでそこだけ「符号化までは含まない
単体」の話になるんだよ。
0815デフォルトの名無しさんNGNG
>>814
知るかYo
0816デフォルトの名無しさんNGNG
>>815
そうかYo
0817デフォルトの名無しさんNGNG
>>815-816
も前らに聞いてないYo
0818デフォルトの名無しさんNGNG
>>814
それなら、その限定ソートの部分を完全ソートに置き換えればいいだけでは?
BWTは速度を気にしなければ、
・読み込んだバッファを2倍にして同じものをコピー(2行)
・インデックス生成(1行)
・ソート(qsortでも何でもいい)(1行)
・比較関数(2,3行)
・FirstIndexとソート結果のインデックスから文字を出力(4,5行)
で書けます。マルチで書けば、ほとんどが一行に収まります。
0819デフォルトの名無しさんNGNG
能書きはいいからさっさとやって見せろって。
0820デフォルトの名無しさんNGNG
>>819
7行スレのBWTを分解して>>649に組み込めYo
0821デフォルトの名無しさんNGNG
>>820
面倒だYo
お前がやってくれYo
0822デフォルトの名無しさんNGNG
書きたいものは何ですか  難しいものですか?
スレの中もログの中も  探したけど見つからないのに
まだまだ探す気ですか  それより自分で書いてみませんか?
BWTを BWTを 書いてみたいと思いませんか?
ウフッフー  ウフッフー  ウフッフー  さーあー!
0823デフォルトの名無しさんNGNG
>>822
BWTは7行スレpart2にあったはず。現在dat中。
0824デフォルトの名無しさんNGNG
あーもう、ごまかすなよ
0825デフォルトの名無しさんNGNG
>>786みろよ。
なんでqsortつかったトロいソート書くんだよ?

七行part2のブロックソートって

#include <stdlib.h>
typedef unsigned char b;e(b*s,b*d,int c){unsigned*o,i=0,r;o=calloc(65536,4);c--
;for(i;i<c;i++)o[s[i]<<8|s[i+1]]++;o[s[c]<<8|*s]++;for(i=1;i<65536;i++)o[i]+=o[
i-1];d[--o[s[c]<<8|*s]]=s[i=c-1];for(;i;i--)d[--o[s[i]<<8|s[i+1]]]=s[i-1];r=--o
[*s<<8|s[1]];d[r]=s[c];free(o);return r;}

これと

#include <stdlib.h>
typedef unsigned char B;void d(B*s,B*d,int c,unsigned x){unsigned*o,i,a=0,t[256
];memset(t,0,1024);for(i=--c;i;i--)t[s[i]]++;o=calloc(65536,4);for(;i<256;i++){
memset(d+a,i,t[i]);a+=t[i];}for(i=0;i<=c;i++)o[(s[i]<<8)+d[i]]++;for(i=1;i<
65536;i++)o[i]+=o[i-1];*d=d[x];d[c]=s[x];d[c-1]=s[--o[(d[c]<<8)+*d]];for(i=c;i>
2;i--)d[i-2]=s[--o[d[i-1]<<8|d[i]]];free(o);}

これと

#include <stdlib.h>
enum{S=256};typedef unsigned char UC;int cmp(void*a,void*b){return memcmp(a,b,S
);}UC*bs(UC*s,UC*d){UC*p,**t,i;p=malloc(S*2);t=malloc(S);for(i=0;i<S;i++)p[i]=p
[i+S]=s[i],t[i]=p+i;qsort(t,S,S,cmp);for(i=0;i<size;i++)if(p== t[i])break;*d++=
i;for(i=0;i<S;i++)d[i]=t[i][S-1];free(p);free(t);return --d;}

これくらいだぞ
0826デフォルトの名無しさんNGNG
限定ソートって、なんかメリットあるの?
デコるときの複雑さと遅さを考えると、使う気になれない。
0827デフォルトの名無しさんNGNG
別に複雑でもないみたいだが。
ケツから復元していけば良いだけだろ?
まぁ、キャッシュは外れまくりそうだが…
0828デフォルトの名無しさんNGNG
>>827
デコードは完全ソートの方がシンプルで高速だよね。
0829デフォルトの名無しさんNGNG
このスレの伸び具合はネタがあるかどうかじゃなくて
必死なヤツがいるかどうかだったのか…

おまいら必死だな(藁
0830デフォルトの名無しさんNGNG
BrainFuck <[+-.,]>
http://pc3.2ch.net/test/read.cgi/tech/1036013915/

圧縮してくれ
0831デフォルトの名無しさんNGNG
なんか物凄くどうでも良いことで言い争ってるように見える…
0832デフォルトの名無しさんNGNG
>>830
pc3.2ch.net/test/r.i/tech/1036013915

少し短くしますた。
0833デフォルトの名無しさんNGNG
結論:S Y N 逝 っ て よ し
糸冬 了
0834デフォルトの名無しさんNGNG
never
never
uzeee
0835shinnetNGNG
DGCAのソースは七行です
0836デフォルトの名無しさんNGNG
もうちょい実のある話をしなさい
0837デフォルトの名無しさんNGNG
でもまぁ、叩かれるだけマシだよなー。

話題にも上らないよりかは。。

0838デフォルトの名無しさんNGNG
そ、そんなことないですよっ!
ボクは、僕はyz2も大好きです!!
0839yz2NGNG
叩かれるのはイヤでつ。
0840デフォルトの名無しさんNGNG
っていうか、いつまでアルファなんだよ!>yz2
0841デフォルトの名無しさんNGNG
Cマガの記事によれば もーすぐ新しいバージョン出るらしいけど。
ベータになるのか、アルファのまんまか、はたまた出ないのか?
0842デフォルトの名無しさんNGNG
yz3のアルファ版
0843デフォルトの名無しさんNGNG
yz3とDGCAは統合されます。
0844デフォルトの名無しさんNGNG
HSP 最高
0845デフォルトの名無しさんNGNG
>>844
初耳です。

> HSP(High Speed signal Processor)
> 各種圧縮/伸張フォーマット(*2)に対応した高速DSPです。
うーん。アルゴリズムと関係あるのか?
0846デフォルトの名無しさんNGNG
>>540みたいのってAAのアシュークにイインジャネーノ?
同じ全角文字はたくさん出てくるだろうし
半角文字2つの同じ並びもたくさん出てくるだろうし。
0847デフォルトの名無しさんNGNG
まぁ、その、なんだ。
人様の作ったものに対して色々文句言ってるやつがいるが、
文句があるなら自分で作ればよかろう。
それも出来もしないなら、おとなしくいていろってこった。
0848デフォルトの名無しさんNGNG
>>847
激しく同意
0849デフォルトの名無しさんNGNG
>>847
同意。
0850デフォルトの名無しさんNGNG
>>847
まったく同意
0851デフォルトの名無しさんNGNG
847がSYNで、同意している奴らがGCA叩いてたアホどもだったらわらえる
0852デフォルトの名無しさんNGNG
>>851
SYNタンは>>847とは逆の意見という罠

download板での発言

578 名前:SYN 投稿日:02/01/23 22:44 ID:NsxsovNn
>>562
様々な改善案を教えていただけるだけでなく、本音で「ここが糞」
という意見が聞ける2chは、本当にありがたいです。
0853デフォルトの名無しさんNGNG
学生の頃書いた二段階ソート法によるBW変換(当時のコメント削って50行)
もっと速いバージョンはバグが入ったので、今作りなおしている。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static unsigned char *pText;
static int gLen;
int compare(const void *a, const void *b) {
 int l = gLen - ((*(int *)a < *(int *)b) ? *(int *)b : *(int *)a);
 int r = memcmp((const char *)(&pText[*(int *)a]),
         (const char *)(&pText[*(int *)b]), l);
 return (r == 0) ? (*(int *)b -*(int *)a) : r;
}

int main(int argc, char *argv[]) {
 FILE *fp;
 unsigned char *str;
 int i, j, k, l, *aArray, *aNext, pos, list[256], sum[256];

 if (argc < 2) {puts("usage> exec infile"); return -1;}
 fp = fopen(argv[1], "rb");
 fseek(fp, 0, SEEK_END); gLen = ftell(fp); rewind(fp);
 pText = str = (unsigned char *)malloc(gLen +1);
 fread(str, 1, gLen, fp);
 str[gLen] = 0;
0854853続きNGNG
 aArray = (int *)calloc(gLen +1, sizeof(int)); /* これが suffix array */
 aNext = (int *)malloc(sizeof(int) *(gLen +1));
 for (i = 0; i < 256; i++) {
  list[i] = -1;
  sum[i] = 0;
 }
 for (i = gLen; i >= 0; i--)
  if (str[i] > str[i +1]) sum[str[i]] += 1;
  else {
   aNext[i] = list[str[i]];
   list[str[i]] = i;
  }
 for (pos = i = j = k = 0; j < 256; j++) {
  pos = i = sum[j] + pos;
  for (l = list[j]; l >= 0; l = aNext[l]) aArray[pos++] = l;
  qsort(aArray + i, pos - i, sizeof(int), compare);
  for (l = i - sum[j]; l < i; l++) {
   if (aArray[k] == 0) k++;
   aArray[l] = aArray[k++] -1;
  }
 }
 return 0;
}
0855853NGNG
うわーん、これもバグありのバージョンを持ってきちゃった・・・打つ。
0856853NGNG
>>853-854 におけるmain関数内の次の部分を置き換えてほしいでつ

int i, j, l, *aArray, *aNext, pos, list[256], sum[256], typeA[256], t = 0;

...

 for (i = gLen; i >= 0; i--)
  if (str[i] > str[i +1]) {
   sum[str[i]] += 1;
   t++;
  }
  else {
   aNext[i] = list[str[i]];
   list[str[i]] = i;
  }
 for (pos = i = j = 0; j < 256; j++) {
  pos = i = sum[j] + pos;
  for (l = list[j]; l >= 0; l = aNext[l]) aArray[pos++] = l;
  qsort(aArray + i, pos - i, sizeof(int), compare);
  typeA[j] = i - sum[j];
 }
 for (i = 0; t >= 0; t--) {
  if (aArray[i] == 0) i++;
  aArray[typeA[str[aArray[i] -1]]++] = aArray[i++] -1;
 }
0857デフォルトの名無しさんNGNG
>856
よくわかんないけど最後のforはもっと長くループさせないとだめじゃない?
たとえば、最後までまわすとか
for (i = j = 0; j < gLen; j++) {
0858853NGNG
>>857
そうでつた。元のソースではそうなってたのに・・・撃つ。
0859デフォルトの名無しさんNGNG
超hoshu
0860デフォルトの名無しさんNGNG
AA の
0861デフォルトの名無しさんNGNG
圧縮方法は
0862デフォルトの名無しさんNGNG
文字サイズを小に!!
0863デフォルトの名無しさんNGNG
>>860-862
kterm + lynx で見て、unreadable にすればいいのだ!
0864デフォルトの名無しさんNGNG
>>863
Tiny なら、全体のバランスを調整するときに使ったことはあるが。
(IEのフォントサイズ小みたいに)

unreadable は本当に読めないし、つぶれるからいまいち。
0865デフォルトの名無しさんNGNG
http://pcweb.mycom.co.jp/news/2002/11/13/09.html
これってどうなのさ
0866デフォルトの名無しさんNGNG
>>865
強敵だな(w
0867デフォルトの名無しさんNGNG
>865
lossyな圧縮か。比べてもあまり意味ないな…
0868デフォルトの名無しさんNGNG
ソースネクストは、JPEG/GIFなどの画像ファイルを圧縮してファイルサイズを縮小できる
圧縮ソフトを発表した。

使用されているCATアルゴリズムは、圧縮アルゴリズムを複数用いるこ とで、例えば画像
であれば「建物」「空」といったパーツごとに最適な圧縮アルゴリズムを選択し、ファイルサ
イズを縮小する。

同社調査によれば、3.33MBのJPEG画像が、ZIP圧縮の場合3.31MBにしかならなかった
ものを、114KBにまで縮小できた。

不可逆圧縮だが、見た目上はほとんど変わらない画像になる。複数のアルゴ リズムを
利用するにもかかわらず、 

「圧縮・解凍時間ともに短時間」 である点も 特徴だ。
http://pcweb.mycom.co.jp/news/2002/11/13/09.html
0869デフォルトの名無しさんNGNG
不可逆圧縮興味なし。
0870デフォルトの名無しさんNGNG
要するに画像を圧縮してるんであって、JPEGファイルを圧縮してるわけじゃない。
MPEG1をMPEG4にコンバートしてるようなもんだろ?
ZIPと比べてるのは不当表示だよ。
0871デフォルトの名無しさんNGNG
まさにMPEG4のオブジェクト圧縮に似てるね。
0872デフォルトの名無しさんNGNG
JPEG2000とか同じく不可逆で縮みそうなものと比べるべきだわな
0873デフォルトの名無しさんNGNG
で、これはなんてフリーソフトが元なの?
0874デフォルトの名無しさんNGNG
http://pc3.2ch.net/test/read.cgi/software/1034921591/483-
0875デフォルトの名無しさんNGNG
494:◆Ukspgzd3n6:sage:02/11/13 (水) 23:54 ID:3tJrW3s5
http://www.quikcat.com/
超縮は、↑の QuikCAT Messaging Optimizer の
日本語版・・・のような気がするなぁ。拡張子も同じ .qcf だし。
英語版だけど、試用できるっぽい。

495:名無しさん@お腹いっぱい。:sage:02/11/13 (水) 23:57 ID:7Pz0RnHA
↑にあるのはただのデコーダなだけじゃない?

496:◆Ukspgzd3n6:sage:02/11/14 (木) 00:05 ID:SsZE8nfL
>>495
あ・・・そうだった。
でも、圧縮する方法あり。
http://www.quikcat.com/products/qmo/qmo_tryit.htm
要するに、[email protected] にファイルを
送ると、圧縮して返送してくれる。
ちょっと試してみる。
0876 ◆Ukspgzd3n6 NGNG
>>875
まだ [email protected] からの返事が無い。

ちなみに、フリーソフトの Compressed File Reader は 6MB もする。
何だかと思えば、解凍ルーチンの DLL が妙にデカい。


相当複雑なアルゴリズムなんだろうなぁ。多分。
0877 ◆Ukspgzd3n6 NGNG
>>876
> 相当複雑なアルゴリズムなんだろうなぁ。多分。
て、そんなこと無いな。(・∀・;)
0878デフォルトの名無しさんNGNG
そこへメールだしても、ファイル盗まれるだけ
0879 ◆Ukspgzd3n6 NGNG
>>878
漏れは、盗まれても構わないファイルを送ったYo

しかし、きちんと「圧縮してくれ」と文面に書いておかないと駄目かも。
未だに返事は来ないし。
0880デフォルトの名無しさんNGNG
大方英語が向こうに伝わっていないのではないか。
翻訳サイトなんか当てにならない。
0881デフォルトの名無しさんNGNG
英語分かる人にチェックしてもらった方がよいね
翻訳サイトが不自然な英語であることを見抜けないなら
0882デフォルトの名無しさんNGNG
あきらめたのか?
0883デフォルトの名無しさんNGNG
バイトペアエンコーディングをもうちょっと詳しく知りたい。Cマガの
情報である程度はわかったけど、詳しいインプリメンテーションが
よくわからん。何か情報ない?
0884デフォルトの名無しさんNGNG
>>883
ttp://mcgi2.nifty.ne.jp/cgi-bin/thread.cgi?user_id=VZV05226&disp_no=1068&log_no=484&msg_per_page=10&def=10
これじゃ不満なのか?
(゚∀゚)Sタン ニ アヤマレ!
0885デフォルトの名無しさんNGNG
>>884
いや、情報はありがたいのだが、そのレベルはCマガに出ているのよ。
ただCマガのソースってコメントがほとんどないし、バグは残ってるし
で今ひとつわからん(展開スタック不足だった>Cマガソース)。
ちなみに、その掲示板の「アスキー128を8ビットで〜」のくだりは半分
間違い。バイナリデータの圧縮にも効果はあるし、圧縮パラメータの
設定次第だがLZW法に近い圧縮率が得られる。しかも圧縮は遅いが
展開は高速(ビットレベルで符号化しないから当然)。
088657NGNG
Cマガ版にあったバグ除いた(多分)コード見つけた。(英語)
http://www.csse.monash.edu.au/cluster/RJK/Compress/problem.html
http://www.csse.monash.edu.au/cluster/RJK/Compress/bpe.c
http://www.csse.monash.edu.au/cluster/RJK/Compress/bpd.c

日本語の解説のページは数年前はあったんだけど今は消えてる。
0887デフォルトの名無しさんNGNG
>>885 設定次第だがLZW法に近い圧縮率が得られる。
んなこたぁない。
割り当てキャラクタ数を最適化したとしてもLZファミリには及ばないよ
0888デフォルトの名無しさんNGNG
>>887
同意

>ちなみに、その掲示板の「アスキー128を8ビットで〜」のくだりは半分
>間違い。バイナリデータの圧縮にも効果はあるし、圧縮パラメータの
>設定次第だがLZW法に近い圧縮率が得られる。

オリジナルのBPEは純粋に7ビットASCIIオンリーだったはず。
バイナリ対応やLZW並みの圧縮率というのは、改良版ではないか?
0889デフォルトの名無しさんNGNG
>>883-888

Gage[1994]が見つからなかったが(雑誌の記事だから?)、
調べてみると、BPEには単純版と改良版があるらしいぞ。
そもそもその単純版が、1994年よりももっと前(70年代〜80年)に
提案された別の方法を改善したものとして存在し、
それをさらにバイナリデータ対応、LZW並みの圧縮性能にしたのがGageらしい。

やぱーり、The C Users Journal, February 1994 edition か
Cマガジンを読むしかないのか。
0890デフォルトの名無しさんNGNG
>>887
885だけど、それは頻出バイトペアや未使用キャラクタの余り数、圧縮ブロックの
サイズ設定とかでかなり違ってくると思われ。LZWに適したデータ分布やBPEに
適したデータ分布は当然あると思うし、頭ごなしに全否定するのもどうかと思うが。

で、圧縮率に関しては「近い」というのがミソで、LZW以上の圧縮を得ようとは思わ
ない。展開が非常に高速で(展開のコストが安く)実用になる圧縮率があることが
重要なんだよ。実際にCマガのをデバッグしたソースでバイナリを圧縮してみたが
多くの場合で半分から45%程度に縮んでいた。これくらいなら十分。
0891デフォルトの名無しさんNGNG
>>886
>>889
ありがとう、参考になった。
0892デフォルトの名無しさんNGNG
>>890
検証してないけど、LZWってBPEより必ず圧縮率がいいんじゃないか?
両者とも、SEQUITORと同じ系に属するだろ?
で、両者が作る辞書のモデルを解析して比較してみれば、
その関係がわかると思うんだけど・・・。

BPEの辞書はLZWの増分分解で作成される辞書と同じ形になる・・・と思うし、
後は出現頻度順か、出現順かの違いくらいで・・・。

多分誰か解析していると思うなぁ・・・njNECで探してみるか。
0893デフォルトの名無しさんNGNG
超縮はJPEG2000だった!?
ttp://homepage1.nifty.com/author/qcf/jpegqcf.htm
0894SタソファソNGNG
>>893
Sタンの粗相、もとい予想、大当たりですね。
0895デフォルトの名無しさんNGNG
 ところでところで、オフィスノアの動画圧縮 Nancy codec って、どんなアルゴリズム使ってるか、ご存じない?  特許情報調べればわかるのかもしれんのですが…。
0896デフォルトの名無しさんNGNG
>>895
差分とって、誤差が一定になるまで出力しない、っていうのじゃなかったかなぁ?
どっかの紹介記事にそういう説明があった気がする。
試しにやってみても、全然縮まなかったので、
もちろんもっとそれ以上の何かが必要なのだろうけど。
0897アフォヴァカさんNGNG
今日、Cマガのyz2の記事読んだんだけど
なんでファイルサイズをわざわざテキストで
出力するかイマイチ理解出来ん。
小さいファイルなら元ファイルのサイズを出力する
と確かに無駄な部分が出てくるが、それだったら
16進表記でテキスト出力した方が効率か良いよう
な気がする・・・数字+アルファベットで36進数で表記とか・・・
ってここまで面倒な事はしなくていいか(w


0898デフォルトの名無しさんNGNG
>>897
Elias符号使えば?
0899 ◆Ukspgzd3n6 NGNG
>>897
記事にワケが書いてあったと思う。

それに、テキストで出力しておけば、事実上どこまでも
大きいファイルサイズも表現できると思うが。
0900デフォルトの名無しさんNGNG
>>899
別にテキストじゃなくても同じことができるし
テキストを使わないほうが小さくなることに変わりはない。
0901 ◆Ukspgzd3n6 NGNG
>>900
そりゃね。
Filesize のビット数を記録すれば問題ないことだし。

#テキストだとしても、ヘッダごと圧縮すれば問題ないかも。
0902デフォルトの名無しさんNGNG
>>901
そのために>>898に書いてあるような符号化法を使うんだろ????
0903デフォルトの名無しさんNGNG
>>900
ヘッダのサイズなんて大きな圧縮ファイルでは誤差の範囲だろ。
”Keep it simple, stupid.(単純なままにしとけって言っただろ!このヴォケが!)”だ。
0904デフォルトの名無しさんNGNG
>>903
数値1つエンコードするのが複雑だというくらいなら
そもそも圧縮プログラムなんて論外だろ。

だいいち、2進10進変換+10進2進変換がエリアス符号に比べて
そんなにシンプルかよ。糞ヴォケ。
0905デフォルトの名無しさんNGNG
テキスト使うなんて白痴もいいところ。
0906デフォルトの名無しさんNGNG
Cマガ読んでないから知らないけど、
書庫内のファイル名も圧縮対象にするってこと?
識別用のマジックナンバー以外はやっちゃってもいいかもね。
リスト出力に多少時間かかりそうだけど。

どうでもいいけど、作るんなら統合アーカイバPrjのDLL形式にも
対応して欲しい。(GCAとか対応してたっけ?)
わざわざ独自にGUI作ったりしてるのあるけど、無駄にしか思えない。
0907デフォルトの名無しさんNGNG
つーかファイルサイズなんてリトルエンディアンのint64でいいんじゃないのか。
0908デフォルトの名無しさんNGNG
Elias = イライアス
レス数が900を超えています。1000を超えると表示できなくなるよ。