如何生成以下序列?

时间:2013-02-23 07:12:42

标签: algorithm permutation combinations apriori

我想生成以下序列:

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)个数的所有可能子集,其约束条件是它们按字母顺序排列(数字按顺序排列)。

是否有任何算法或方法可以解决特定问题?我知道我们可以使用递归来生成更小的子集。

5 个答案:

答案 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
  • 如何识别要从每个集合中移除的数字 n (n:N .. 1)

从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]]