【发布时间】:2012-09-14 11:42:01
【问题描述】:
我正在尝试用蛮力方法解决maximum sub array problem,即生成所有可能的子数组组合。我得到了一些有用的东西,但它根本不令人满意,因为它产生了太多重复的子数组。
有谁知道用最少数量的重复元素生成所有子数组(以 [[]] 形式)的聪明方法吗?
顺便说一句,我是 Haskell 的新手。这是我目前的解决方案:
import qualified Data.List as L
maximumSubList::[Integer]->[Integer]
maximumSubList x = head $ L.sortBy (\a b -> compare (sum b) (sum a)) $ L.nub $ slice x
where
-- slice will return all the "sub lists"
slice [] = []
slice x = (slice $ tail x) ++ (sliceLeft x) ++ (sliceRight x)
-- Create sub lists by removing "left" part
-- ex [1,2,3] -> [[1,2,3],[2,3],[3]]
sliceRight [] = []
sliceRight x = x : (sliceRight $ tail x)
-- Create sub lists by removing "right" part
-- ex [1,2,3] -> [[1,2,3],[1,2],[1]]
sliceLeft [] = []
sliceLeft x = x : (sliceLeft $ init x)
【问题讨论】:
-
请注意,您使用的是链表,而不是数组,因此您的算法不会像您期望的那样复杂。
-
@DonStewart 你说得对,我正在使用列表。实际上,由于问题的名称(“最大子数组”),我在描述中提到了“数组”,我猜这是个坏主意
-
我不得不咯咯地笑“我正在使用蛮力方法......但它一点也不令人满意......”。