[osask 6963] bim2bin4f.

  こんばんは、川合です。

  運良く圧縮パラメータ最適化方法を思いつけて、それなりに効果があ
ったので、bim2binをバージョンアップします。

  ついでに展開ルーチンのバグを直しました(だから、bim2bin4eで圧
縮したものはもちろんbim2bin4fでも展開できますが、4fで圧縮したも
のの一部は4eで展開できません)。展開ルーチンのバグはASKAで展開
ルーチンを書いているときに発見したものです。

  それとbim2bin4eに対して、tek1のフォーマット互換性は保たれてい
ますが、tek2のフォーマット互換性は保たれていません。

    http://k.hideyosi.com/bim2bi4f.lzh  (38.4KB)

  圧縮比較表は次のように更新されました。ブロックサイズなどは前回
と同じ条件ですが、追加で次のオプションをつけています。hellok1〜
zero64kはclv:2、bim2bincとkdun00bはclv:1、osaskgoは追加オプショ
ン無し。

              org      tek0     tek1     tek2     bz2      rk
  hellok1      272      128      126      125      166      208
  zero4k      4096       27       25       25       43      100
  zero64k    65536       28       27       27       43      108
  bim2binc   53792    15091    14556    14152    12903    11608
  kdun00b   655360    46246    45651    44453    47306    36736
  osaskgo  1973741  1149662  1140715  1129698  1047411   909824

              org      tek0     tek1     tek2     bz2      rk
  hellok1    217.6    102.4    100.8    100.0    132.8    166.4
  zero4k     16384    108.0    100.0    100.0    172.0    400.0
  zero64k   242726    103.7    100.0    100.0    159.3    400.0
  bim2binc   463.4    130.0    125.4    121.9    111.2    100.0
  kdun00b   1784.0    125.9    124.3    121.0    128.8    100.0
  osaskgo    216.9    126.4    125.4    124.2    115.1    100.0

  対rk指数のワースト値が、127.0→125.4(tek1)、125.9→124.2(tek2)
と、1.6以上さがっています。不得意の部分が改善して、汎用可逆圧縮
としては好ましいという印象がさらに強くなっています。

  毎度のOSASKアプリです。以下はclv:2とclv:1が混ざっています(
clv:2で時間がかかったらclv:1にした)。

             tek0    tek1    tek2    tek0→tek2での改善率
  helloc4     497     491     489           1.61% 
  helloc9     176     174     172           2.27%
  bballc0     628     619     617           1.75%
  bballc2     295     293     291           1.36%
  invader2   1699    1678    1676           1.35%
  invader5   1258    1242    1241           1.35%

  clvというのは圧縮レベルで、デフォルトが0です。0でも結構小さく
なります。1にすると圧縮時間が劇的に増えますが、圧縮率が少しよく
なります。2にすると圧縮時間がさらに増えますが、圧縮率もさらにも
う少しよくなります。基本的に限界に迫りたいとき以外はデフォルト
のままでいいと思います。

  ええとinvader2はtek2の値が改悪になっています。これを回避する
ことはたぶんできるのですが、今回のバージョンではこの改悪を気に
しないことにしました(どうも前のは運よく高圧縮になっただけのよ
うなので)。

  僕としては、ついにinvader5がTownsOS版と同じサイズになったのが
うれしいです(笑)。

  圧縮速度ですが、clv:0ならたぶんtek0と同程度くらいには速くなっ
ています。とりあえずbim2bin4eよりは明らかに速いです。もっと速く
するには、最長一致検索アルゴリズムをまともにすればいいだけなの
ですが、相変わらず手抜きでやっていません。すみません。

  ええと、今回の値がtek1/tek2の最終的な圧縮率だと思う人がいるか
もしれませんが、全然そんなことはありません。tek1/tek2はまだまだ
潜在能力を秘めていて、さらに圧縮率が上がる余地があります(確実に
圧縮率が上がりそうなことを面倒なのでやってない・・・展開ルーチン
側には既に展開用コードが書いてあるのですが)。

  tek1とtek2の符号化の基本はスライド辞書法+UC0(汎用符号0:ユニ
バーサルコード0)になっています。UC0はハフマン符号よりもずっと単
純な代わりに圧縮率の劣る符号で、今まで考えたD3やD4やL0aやL1aや
L1bやdf符号のどれにでも化けるような、そんな符号です(もちろんこ
れらを超える符号にもなれる)。

  bzip2がブロックソートを使っているのに対して、LHAの「スライド辞
書法+ハフマン符号」は旧世代アルゴリズムなどとも言われていますが
、tek1/tek2はそのLHAにも劣るアルゴリズムといえるでしょう(そうで
ないと展開ルーチンがLHA並みに大きくなってしまいますし)。しかし
それでもtek2はLHAの最高圧縮形式である-lh7-形式といい勝負をしてい
ます。今は全体的見て圧縮率ではやや劣っている感じですが、今後の圧
縮アルゴリズムの改良で、lh7に勝てるようになる可能性はあります。
ちなみにlh5というのが一般的に配布されているlzhの圧縮形式です。

             tek1     tek2      lh5      lh7      bz2      rk
  bim2binc   14556    14152    15073    14106    12903    11608
  kdun00b    45694    44453    46955    45446    47306    36736
  osaskgo  1140715  1129698  1137462  1098990  1047411   909824

             tek1     tek2      lh5      lh7      bz2      rk
  bim2binc   125.4    121.9    129.9    121.5    111.2    100.0
  kdun00b    124.3    121.0    127.8    123.7    128.8    100.0
  osaskgo    125.4    124.2    125.0    120.8    115.1    100.0

  とりあえずこんなにしょぼいアルゴリズムだけでもここまでいけると
いうのを示したのはそれなりに意味があると自分では思っています。ス
ライド辞書法は展開時にブロックソートよりも少ないメモリしか必要と
しませんし、UC0はハフマン符号よりも少ないメモリしか必要としませ
ん。

  それでは。

--
    川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! osask.jp
Homepage http://osask.jp/

ML番号でジャンプ
ML単語検索