一种针对输入进行功能组合置换优化的更好方法吗?

时间:2019-01-11 14:00:35

标签: haskell

我有功能列表及其“应用优先级”。

看起来像这样。它的长度是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排序并且不包含重复的列表)

还是这个问题本质上是一个漫长的过程?

1 个答案:

答案 0 :(得分:0)

我正在生成不必要的排列。

choose函数基本上是不确定的take函数

 choose 0 xs = [[]] 
 choose n [] = [] 
 choose n (x:xs) = map (x:) (choose (n-1) xs) ++ choose n xs

大大提高了性能。