動的計画法を使用して加重間隔スケジューリングの問題を解決するプログラムがあります(信じられないかもしれませんが、宿題用ではありません)。私はそれをプロファイリングしました、そして私は私の時間のほとんどをp(...)でMを満たすことに費やしているようです。関数は次のとおりです。
let rec get_highest_nonconflicting prev count start =
match prev with
head :: tail ->
if head < start then
count
else
get_highest_nonconflicting tail (count - 1) start
| [] -> 0;;
let m_array = Array.make (num_genes + 1) 0;;
let rec fill_m_array ?(count=1) ?(prev=[]) gene_spans =
match gene_spans with
head :: tail -> m_array.(count) <-
get_highest_nonconflicting prev (count - 1) (get_start head);
fill_m_array tail ~prev:(get_stop (head) :: prev) ~count:(count+1);
| [] -> ();;
これを最適化する方法を実際に考えることはできません。このアルゴリズムに関する私の知識に基づくと、これは最も時間がかかる可能性が高い場所のようです。しかし、これは私の2番目のOCamlプログラムでもあります。では、これを最適化する方法はありますか?