【发布时间】:2024-01-09 10:18:01
【问题描述】:
这两天我一直在摸不着头脑,我想不出解决办法。我正在寻找的是一个函数f(s, n),它返回一个包含s 的所有子集的集合,其中每个子集的长度为n。
演示:
s={a, b, c, d}
f(s, 4)
{{a, b, c, d}}
f(s, 3)
{{a, b, c}, {a, b, d}, {a, c, d}, {b, c, d}}
f(s, 2)
{{a, b}, {a, c}, {a, d}, {b, c}, {b, d}, {c, d}}
f(s, 1)
{{a}, {b}, {c}, {d}}
我有一种感觉,递归是要走的路。我一直在摆弄类似的东西
f(S, n):
for s in S:
t = f( S-{s}, n-1 )
...
但这似乎并不奏效。我确实注意到len(f(s,n)) 似乎是二项式系数bin(len(s), n)。我想这可以以某种方式使用。
你能帮帮我吗?
【问题讨论】:
-
搜索词将是“查找子集排列”,类似这样。某些语言(如 C++)具有内置库支持。是的,从数学上讲,这可能是一种递归算法。如何以某种语言在实践中最好地实现它是另一回事。
-
这似乎很相似的问题:*.com/questions/61592209/…
-
我认为他们正在寻找长度组合
n,因为他们的结果是无序元组@Lundin -
@Lundin 和达米安。如果我没记错的话,排列是有序的,哪些不是。
-
无论如何,它都是相同的算法。集合的优点是您没有重复项,而不是用于查找字符串的所有子字符串的算法。同样在实践中,我不太明白如何以可行的方式实现一个集合而不对其进行排序,或者添加/删除将非常低效。例如,C++
std::set带有强制排序顺序,您必须提前定义一种方法来比较集合中的项目,以便使用容器类。