下面是我对4 4clojure 问题108的回答
我能通过前三次测试,但最后一次测试超时了。在最后一次测试中,代码运行得非常非常慢。到底是什么导致了这一切?
((fn [& coll] (loop [coll coll m {}]
(do
(let [ct (count coll)
ns (mapv first coll)
m' (reduce #(update-in %1 [%2] (fnil inc 0)) m ns)]
(println m')
(if (some #(<= ct %) (mapv m' ns))
(apply min (map first (filter #(>= (val %) ct) m')))
(recur (mapv rest coll) m'))))))
(map #(* % % %) (range)) ;; perfect cubes
(filter #(zero? (bit-and % (dec %))) (range)) ;; powers of 2
(iterate inc 20))发布于 2014-09-11 18:14:48
您正在从每个迭代(recur (mapv rest coll) m')上的每个输入中收集下一个值。
您的一个输入生成值的速度非常慢,并且非常快地计算到非常高的值:(filter #(zero? (bit-and % (dec %))) (range))。
您的代码正在花费大部分时间,通过增加一个和测试位元来发现两个的能力。
您不需要一个包含事件计数的所有输入的映射。您不需要为尚未找到的最低项找到下一个值。我不会发布解决方案,因为这是一个练习,但是在每次迭代中消除最低的不匹配值应该是一个开始。
发布于 2014-09-11 18:31:38
除了这里的其他好答案之外,您还在做大量的数学,但是所有的数字都是作为对象而不是作为原语使用的。做这个更好的这里有很多提示。
发布于 2014-09-11 18:13:16
这是计算2的幂的一种效率很低的方法:
(filter #(zero? (bit-and % (dec %))) (range))这实际上是从0到无穷远的计数,测试每一个数字的过程,看看它是否为2的幂。进入序列越远,每次调用rest的开销就越大。
考虑到这是测试输入,而且您不能更改它,我认为您需要重新考虑您的方法。与调用(mapv rest coll)不同,您可能只想用最小的第一个值调用序列上的rest。
https://stackoverflow.com/questions/25793668
复制相似问题