プログラミングの基礎 saitan_wo_bunriの高速化
ちょっと本の話題とは、脇道にそれました。saitan_wo_bunri関数を次のように定義していて
et saitan_wo_bunri xs = match xs with | [] -> ([], []) | first::rest -> let min = List.fold_right (fun k data -> if k.saitan_kyori < data.saitan_kyori then k else data) rest first in ([min], (List.filter (fun x -> x <> min) xs))
これだと計算回数がO(2n)で少しタコなプログラムで、気になってはいたのですが、話題が高速化の話になってきたので、ここらで高速化しようと次のように変更しました
let saitan_wo_bunri xs = match xs with | [] -> ([], []) | x::xs -> List.fold_right (fun elm tuple -> match tuple with | ([], _) -> ([elm], []) | (min::nil, data) -> if min.saitan_kyori < elm.saitan_kyori then ([min], elm::data) else ([elm], min::data)) xs ([x], [])
これだと計算回数はO(n)回で前回よりも高速に動作するはずです。そのかわりxsの順番が入れ替わるというよくない影響もあります。関数の仕様通り最短の駅を取り出す事には、成功するのですが、dijkstra関数の中に、入れるとなんだかよからぬ動きをするようです。なんでだろう。わかんない。。明日は、この関数の変更の影響を見ていきたいと思います。
ちょっと風邪気味で、体調がよくないです。(昨日もブログ休んでしまった。。)
プログラミングの基礎 ((Computer Science Library))
- 作者: 浅井健一
- 出版社/メーカー: サイエンス社
- 発売日: 2007/03/01
- メディア: 単行本
- 購入: 17人 クリック: 409回
- この商品を含むブログ (127件) を見る