2013-10-30 55 views
0

給出一個列表{x1, x2, x3, x4, ..., xn},有沒有一種算法可以生成這個列表的每個子集?在這種情況下的子集必須具有長度i,其中1 <= i <= n。此外,排序並不重要,例如,這是重複的:{x3, x4, x9}{x9, x3, x4}相同,即不會將重複項放在輸出中。算法的運行時間也必須是O(n^k),對於某些常數整數k>=0生成不同長度列表的每個powerset的算法?

有誰知道如何做到這一點?

謝謝。

+4

「對於某個常數整數k> = 0,算法的運行時間必須爲O(n^k)。」你需要生成的子集的數量是'2^n'。沒有多項式時間算法可以產生'O(2^n)'項目。 – dasblinkenlight

+2

這不是排列組合。對於排列,排序很重要。我認爲你的意思是一個powerset,它是所有子集的集合。 – Shashank

+0

@dasblinkenlight:實際上,OP需要生成的子集的數量是n選擇i,在大O符號中,它是'O(2^i)** Oops **:我認爲OP只需要生成子集爲*特定*'我',顯然它*是所有*'我'。所以是的,它是'O(2^n)' – justhalf

回答

1

在任何給定的子集中,原始集合的每個元素都可以存在或不存在。對於n元素列表,按順序遍歷n位二進制數,選擇對應於1. 0b000 ... 000的元素爲空子集。 0b111 ... 111是原始集合。中間的每個數字都是可能的子集。所有可能的子集將在列表中一次且僅包含一次。

例如,如果原來的集合是{A,B,C}:

0 -> 000 -> {} 
1 -> 001 -> {C} 
2 -> 010 -> {B} 
3 -> 011 -> {B, C} 
4 -> 100 -> {A} 
5 -> 101 -> {A, C} 
6 -> 110 -> {A, B} 
7 -> 111 -> {A, B, C} 

如果需要只具有特定長度的子集,則使用的二進制1計數算法之一,以消除那些數字/子集不匹配。生成數字0到n顯然是O(n)。這將它帶到您使用的二進制1計數算法。沒有必要消除重複,因爲沒有產生。

0

做一些谷歌搜索backtracking.Its你問一個標準的問題。