遍历Int集的算法

时间:2013-12-21 11:19:32

标签: algorithm scala

我不确定这是否是提出这样一个问题的正确位置。我会试一试。

问题:

假设val threshold: Intval size: Int

我正在寻找一种有效的算法来遍历x: Set[Int]x.sum < threshold所有可能的x.size == n。只应考虑大于0的Int。这当然是有限数量的可能性。

我已经尝试开发一种,但即使是较小的输入也需要永远。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以非常轻松地递归生成它们。这是Python中的一些代码,它应该直接转换为Scala。

def sets(n, threshold, atleast=1):
    if threshold <= n * (n + atleast * 2 - 1) // 2: return
    if n == 0:
        yield []
        return
    for i in xrange(atleast, threshold):
        for s in sets(n - 1, threshold - i, i + 1):
            yield [i] + s

print list(sets(4, 15))

答案 1 :(得分:0)

如果有人感兴趣,我将在Scala中发布我提到的算法的实现:

def generatePossibilities(n: Int, threshold: Int) = {
    def sets(n: Int, threshold: Int, atleast: Int = 1) : Set[Set[Int]] = {
      if(threshold <= n * (n + atleast * 2 - 1) / 2) {
        Set.empty[Set[Int]]
      } else if(n == 0) {
        Set(Set.empty[Int])
      } else {
        (for(i <- atleast until threshold;
             s <- sets(n - 1, threshold - i, i + 1)) yield s + i)(collection.breakOut)
      }
    }
    sets(n, threshold)
}