今日はここまで

1,2,3・・・9までの数字を使った順列(9の階乗通り)の全てのパターンを持った2次元配列オブジェクトを作ってみた.

こんなやつね(1,2,3,4の場合)

[1,2,3,4]
[1,2,4,3]
[1,3,2,4]
・・・
[4,3,2,1]

1から4くらいまでだとハードコーディングで済むが,9までだとざっと36万通り以上だから無理.それをRubyで作るという課題ってとこ.何故この課題にしたのかは内緒w

ほとんどの時間がトライアンドエラーによるアルゴリズムの修正に費やされた.最初からアルゴリズムが分かるほど頭良くないんで・・・.で,最近の話題の「静的型付け」「動的型付け」ですがこのコーディングにおいては「どっちでやってもかかった時間はほぼ一緒だったでしょうな」です.理由は既に述べたとおりボトルネックアルゴリズムの設計だったから.



しかし36万行作るのに結構時間がかかる.メモリ200MBくらい使ってるなこりゃ.Time.nowで開始前,開始後の差分とったら約1000とでました.単位はおそらく秒かと.

int[36万][9]とすればCだったら12MBくらいで足りるんでしょうか?あらかじめファイルに出力させておいて読み込ませるほうがやっぱり早いんでしょうか.まあ明日も続きいってみよー.(既に朝の5時ですが・・・)

> 1000秒かかった原因の1つは実行過程を見るためのデバッグログを常に出力させていたことでした.もう1つはアルゴリズムがしょぼ(略.既にコード付き突っ込みが入っているようにRuby自体の速度が原因ではありません.



追記
この記事を見た某先生から15分超は掛かりすぎ,30秒くらいで処理できるコードかけたけど?と突っ込みもらいました.つまり私の書いたコードがヘタレということで.とりあえず動かすので精一杯だったんで(>_<;

ぱっと見,彼のコードと比べてみると,コード量がうちの1/4くらい.Rubyで用意されたクラスとかちゃんと使ってます.うちはベタベタなごり押しコーディング,最初からCPUパワーに頼ってます.参考にさせてもらいます(ぱくり).



追記2
再帰呼び出し+ForループまたはIteratorにて,ほとんど同じアルゴリズムで実装されたRubyコードとJavaコードの速度比較をしてみた.

JavaArrayListが一番早かった.Vectorが健闘して2番目,LinkedListが遅い.ちなみにJakarta Commons-CollectionのFastArrayListはLinkedListと同じくらい遅い(マルチスレッド環境での速度UPライブラリだから仕方ないか).

Vectorで+10%,LinkedListで+25%くらいかな.

今までなかなかLinkedListを使った方が早いケースに出くわさないのだけれども,やっぱり巨大なリストの先頭の方から削除!削除!っていうケースなかなかないもんね.