我想生成以下序列:
set S = {1,2,3}
op = {{1,2},{1,3},{2,3}}
set S = {1,2,3,4}
op = {{1,2,3},{1,2,4},{1,3,4},{2,3,4}}
set S = {1,2,3,4,5}
op = {{1,2,3,4},{1,2,3,5},{1,2,4,5},{1,3,4,5},{2,3,4,5}}
一般来说,给定一组n个数字,我必须找到(n-1)个数的所有可能子集,其约束条件是它们按字母顺序排列(数字按顺序排列)。
是否有任何算法或方法可以解决特定问题?我知道我们可以使用递归来生成更小的子集。
答案 0 :(得分:2)
只有n
个这样的子集;从原始集合中删除n
个原始数字之一。因此,对集合进行排序,并为每个数字创建一个集合,该集合是删除该数字的原始集合。
可能需要注意的是,如果原始集合中存在重复的数字,则原始集合中的唯一数字只会包含尽可能多的子集,因此在这种情况下可能少于n
。
答案 1 :(得分:2)
某些语言内置了此功能。例如,Python的itertools.combinations()
method。在你的情况下:
>>> import itertools
>>> l = [1,2,3,4]
>>> combinations = itertools.combinations(l, len(l) - 1) #for the list of numbers l, for sublists with a length 1 less than l's length
>>> for comb in combinations:
... print comb
...
(1, 2, 3)
(1, 2, 4)
(1, 3, 4)
(2, 3, 4)
>>>
但是,如果你想自己实现这个,上面的链接可能仍然有用,因为它显示了相同的代码。您可以使用此代码以任何语言进行自己的实现。
答案 2 :(得分:2)
这应该很简单。让arr设置排序,n为元素数量:
int arr[100];
int n;
printf("{");
for (int i = n - 1; i >= 0; i--){
printf("{");
for (int j = 0; j < n; j++) {
if (i == j) {
continue;
}
printf("%d, ", arr[j]);
}
printf("}, ");
}
printf("}\n");
上面会打印一些额外的逗号,您可以自行过滤掉它们。
答案 3 :(得分:2)
想想
从1..N
生成/打印一组print "{"
for i=1 to N
if (i > 1) print ","
print i
end
print "}"
如何创建一个从N到1
选择 n 的循环for j=N to 1
...
end
使用最后一个循环作为上述循环的包装 - 并在上面的循环测试中,如果当前所选数字 j 等于 i 并且不打印在那种情况下。
有趣的是Perl实现不假装优化: - )
$N = 5;
sub rec {
my($j,$i,@a) = @_;
if ($j > 0) {
while (++$i <= $N) { push(@a,$i) if ($i != $j); }
print('{' . join(',', @a) . "}\n");
&rec($j-1);
}
}
&rec($N);
或者这,(也许)更传统
for ($i=$N ; $i>0 ; $i--) {
@a = ();
for (1..$N) { push(@a,$_) if ($i != $_); }
print('{' . join(',', @a) . "}\n");
}
答案 4 :(得分:1)
在Haskell中你可以做this:
import Data.List
combinations 0 _ = [ [] ]
combinations n xs = [ y:ys | y:xs' <- tails xs
, ys <- combinations (n-1) xs']
subsets set = combinations (length set - 1) (sort set)
哈斯克尔,简要说明:
_ => anyting
[] => empty list
a = 1; as = [2,3] => a:as = [1,2,3]
[a:b | a <- [1], b <- [[2],[3]]] => [[1,2],[1,3]]
tails [1,2,3] => [[1,2,3],[2,3],[3],[]]
例如,“组合2 [1,2,3]”:
tails xs = [[1,2,3],[2,3],[3],[]]
[1,2,3] => y = 1; ys = [[2],[3]] => [1,2],[1,3]
[2,3] => y = 2; ys = [[3]] => [2,3]
[3] => y = 3; ys = NULL => []
Result [[1,2],[1,3],[2,3]]