我的代码大部分时间都在评分二分:确定图中有多少边从一个节点集跨越到另一个节点集。
假设 bisect
是图 nodes 的一半的集合(整数),edges
是一个由节点(有向边)组成的列表 [ [n1 n2] ...]
,其中 n1,n2 也是节点。
(defn tstBisectScore
"number of edges crossing bisect"
([bisect edges]
(tstBisectScore bisect 0 edges))
([bisect nx edge2check]
(if (empty? edge2check)
nx
(let [[n1 n2] (first edge2check)
inb1 (contains? bisect n1)
inb2 (contains? bisect n2)]
(if (or (and inb1 inb2)
(and (not inb1) (not inb2)))
(recur bisect nx (rest edge2check))
(recur bisect (inc nx) (rest edge2check))))
)))
通过采样代码的执行(使用 VisualVM)我唯一得到的线索是,大部分时间花在 clojure.core$empty_QMARK_
上,以及在 clojure.core$contains_QMARK_
上的时间也最多。(first
和 rest
只占很小的一部分时间。)
有没有什么建议,告诉我如何使代码更紧凌?