我有功能列表及其“应用优先级”。
看起来像这样。它的长度是33
listOfAllFunctions = [ (f1, 1)
, (f2, 2)
, ...
, ...
, (f33, 33)
]
我想要做的是生成一个上面列表的排列列表,没有重复,并且我只希望内部列表中有8个唯一元素。
我正在这样实现
prioratizedFunctions :: [[(MyDataType -> MyDataType, Int)]]
prioratizedFunctions = nubBy removeDuplicates
$ sortBy (comparing snd)
<$> take 8
<$> permutations listOfAllFunctions
其中removeDuplicates
的定义如下
removeDuplicates a b = map snd a == map snd b
最后,我正在将[(MyDataType -> MyDataType, Int)]
的子列表转换为功能和[Int]
的子列表
具有此功能
compFunc :: [(MyDataType -> MyDataType, Int)] -> MyDataType -> (MyDataType, [Int])
compFunc listOfDataAndInts target = (foldr ((.) . fst) id listOfDataAndInts target
, map snd listOfDataAndInts)
像这样(flip compFunc) target <$> prioratizedFunctions
以上所有都是实际代码的简化版本,但应该提供要点。
问题在于该代码几乎永远需要执行。从一些原型上,我认为应该归咎于我在permutations
内部实现prioratizedFunctions
函数。
所以我想知道,是否有更好的方法来做我想要的事情(基本上生成listOfAllFunctions
的排列,其中每个列表仅包含8个元素,每个元素列表按其优先级用snd
排序并且不包含重复的列表)
还是这个问题本质上是一个漫长的过程?
答案 0 :(得分:0)
我正在生成不必要的排列。
此choose
函数基本上是不确定的take
函数
choose 0 xs = [[]]
choose n [] = []
choose n (x:xs) = map (x:) (choose (n-1) xs) ++ choose n xs
大大提高了性能。