我正在阅读一本名为《函数算法设计珍珠》的书。尝试实现分治算法解决“最小自由数”问题。
但是这个方法的速度并没有比那种被称为“朴素”的解决方案更快。而那种方案是:
我不知道为什么会出现这种情况,分治算法有什么问题,如何改进它。尝试使用BangPatterns,在元组中实现了返回第一个列表长度的版本的partition,因此消除了对m = length us的额外遍历。但是这些都没有改进。第一个方法需要超过5秒,而第二个方法在ghci上几乎瞬间完成,输入[0..9999999]。
minfree xs = minfrom 0 (length xs) xs
minfrom a 0 _ = a
minfrom a n xs = if m == b - a
then minfrom b (n-m) vs
else minfrom a (m) us
where b = a + 1 + (n `div` 2)
(us,vs) = partition (<b) xs
m = length us
但是这个方法的速度并没有比那种被称为“朴素”的解决方案更快。而那种方案是:
import Data.List ((\\))
minfree' = head . (\\) [0..]
我不知道为什么会出现这种情况,分治算法有什么问题,如何改进它。尝试使用BangPatterns,在元组中实现了返回第一个列表长度的版本的partition,因此消除了对m = length us的额外遍历。但是这些都没有改进。第一个方法需要超过5秒,而第二个方法在ghci上几乎瞬间完成,输入[0..9999999]。
minfree
适用于无序列表,但是minfree
只对有序列表快速有效。 - Dulguun Otgon