如何针对动态区间调度优化这些ocaml函数?

时间:2009-11-04 12:40:39

标签: performance optimization ocaml dynamic-programming

我有一个解决加权interval scheduling problem using dynamic programming的程序(不管你信不信,这不是作业)。我对它进行了描述,而我似乎花了大部分时间用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);
    | [] -> ();;

我无法想到任何优化此方法的方法,并且基于我对此算法的了解,这似乎是可能占用最多时间的地方。但这也只是我的第二个OCaml计划。那么有什么方法可以优化它吗?

1 个答案:

答案 0 :(得分:2)

你的两个功能没有明显低效的东西。您是否期望您的实现更快,例如参考另一种语言的实现?

我想知道传递给get_highest_nonconflicting的列表。如果你有理由期望这个函数经常传递与先前传递的列表在物理上相同的列表(这包括递归调用传递的子列表),那么缓存就可以提供帮助。

如果您希望列表相同但物理上不同,则哈希值(然后缓存)可能有所帮助。