2013-02-23 58 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]]