Block Sort Algorithm (BWT)

http://d.hatena.ne.jp/moceanstar/20060220/1140433699
より、BWT、いわいるBlock sortの話題を扱っていた。
私も2年程前、コーディングを行ってみたのだが、全くできなかった。
詳しくはhttp://d.hatena.ne.jp/studiokingyo/20041011http://d.hatena.ne.jp/studiokingyo/20041022dkutil_cのdkcBlockSort.cを参照してもらうとして・・・


今、やっとC言語によるクイックソートアルゴリズムによるブロックソートの実装ができた所だ。でも、ブロックソートはクイックソートでも遅いアルゴリズムである。なのでO(n)のソートアルゴリズムが必要だったりする。伏線記事:http://d.hatena.ne.jp/studiokingyo/20060223


で、昔々からDaisuke Okanohara氏のDO++の実装って興味深いなと思っているのです。
google:bsEncoder.hpp]とか[google:bsDecoder.hppとか。
これを見た限り、

  • 1:先頭2byteで分布数えソート 
  • 2:その時先頭2byteで重複していた要素 (例:先頭 ab ab ab bc bc cdならabは3つ bcは2つ cdは1つなのでソートしない)同士で分割してソート
  • 3:その時の状況によって次の2byteの要素を使って1に戻ったり、クイックソートしたり、挿入ソートしたりである。

今これ系のアルゴリズムを実装中である。


で、Blocksortを実装する時、挿入ソートとクイックソートどちらが速いのかテスト

1024byte random data
1 / bs insertion sort / 14834639
2 / bs quick sort / 27418567

なんか、クイックソート負けてるんですけど

6k byte random data
1 / bs insertion sort / 647528702
2 / bs quick sort / 814268104

データの長さを変えても変わらず・・・

56kbyte random data
測定不能・・・ 遅すぎ・・・

多分、私のクイックソートの実装が良くないんだと思う。

1 / bsEncoder sort / 8876325
2 / bs insertion sort / 1312993091
3 / bs quick sort / 1353318909

google:bsEncoder.hppと比べて見ても147倍遅いのだ。私の実装は・・・おrz!!!