Haskell的表现使我们能够比较容易地定义幂函数:直接生成powerset的特定子集?
import Control.Monad (filterM)
powerset :: [a] -> [[a]]
powerset = filterM (const [True, False])
为了能够完成我的任务,它是说幂通过特定功能进行排序,所以我实现一种看起来像这个关键:
import Data.List (sortBy)
import Data.Ord (comparing)
powersetBy :: Ord b => ([a] -> b) -> [a] -> [[a]]
powersetBy f = sortBy (comparing f) . powerset
现在我的问题是,是否有一种方法,只生成一个子集给出了具体的start
和end
点幂的,其中f(start) < f(end)
和|start| < |end|
。例如,我的参数是一个整数列表([1,2,3,4,5]
),它们按其总和排序。现在我想只提取给定范围内的子集,可以说3
到7
。
badFunction :: Ord b => b -> b -> ([a] -> b) -> [a] -> [[a]]
badFunction start end f = filter (\x -> f x >= start && f x <= end) . powersetBy f
badFunction 3 7 sum [1,2,3,4,5]
产生[[1,2],[3],[1,3],[4],[1,4],[2,3],[5],[1,2,3],[1,5],[2,4],[1,2,4],[2,5],[3,4]]
:以更大的子集打交道时实现这一目标的方法之一将是filter
幂集只包括我的范围,但是这似乎(是)无效。
现在我的问题是,是否有办法直接生成此列表,而不必首先生成所有2^n
子集,因为它不会检查所有元素,而是可以“动态地”生成它们,从而大大提高性能。 。
对于任意排序功能,你真的不能做得更好。在您的订购功能中查找可以利用的结构。 – luqui 2015-04-03 19:21:28
什么是排序功能或它的属性是什么?如果没有关于函数的一些知识,你就无法做得更好 - 例如将函数看作是[加密哈希函数](http://en.wikipedia.org/wiki/Cryptographic_hash_function)。 – 2015-04-03 19:34:14