我不确定这是否是提出这样一个问题的正确位置。我会试一试。
问题:
假设val threshold: Int
和val size: Int
。
我正在寻找一种有效的算法来遍历x: Set[Int]
和x.sum < threshold
所有可能的x.size == n
。只应考虑大于0的Int。这当然是有限数量的可能性。
我已经尝试开发一种,但即使是较小的输入也需要永远。
提前致谢。
答案 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)
}