2013-02-23 56 views
1

我要生成顺序如下:如何生成以下序列?

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)号码的所有可能的子集,他们是按字母订单(按顺序编号)。

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

回答

2

只有n这样的子集;每一个都带有从原始组中删除的n原始号码之一。因此,排序集合,并为每个数字创建一个集合,该集合是删除该数字的原始集合。

可能需要注意的是,如果原始集合中有重复的数字,那么您将只拥有与原始集合中唯一数字一样多的子集,因此在这种情况下可能少于n

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

这应该很简单。让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"); 

上面打印一些额外的逗号,你可以自己筛选出来。

2

想一想

  • 如何生成该组1..N
  • 如何识别Ñ从每个集合中移除数(n:N .. 1)

要生成/从1..1

print "{" 
for i=1 to N 
    if (i > 1) print "," 
    print i 
end 
print "}" 

如何创建一个厕所打印一组p,其选择由N- Ñ 1只

for j=N to 1 
    ... 
end 

使用最后一个循环为围绕上述环路的包装 - 和在上述循环试验,如果当前选择的号码Ĵ等于和在这种情况下不要打印它。

的乐趣一个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"); 
} 
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) 


Haskell,brie飞:

_         => 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]]