輸出乙個集合的所有子集合

2021-06-21 06:18:22 字數 808 閱讀 9268

面試遇上了這個問題,思量了會,想到用遞迴的方式解決這個問題。回來網上搜尋了下,發現通過二進位制的思想來解決這個問題更容易,下面我把兩種解決方式的思想及原碼分享出來。

我們都知道,乙個含n個元素的集合擁有2^n個子集合,並且不難發現,其中每個子集合都是從0到2^n-1 每個數的二進位制格式中0 放棄,1選擇的結果。集合的所有子集合如下所示: 

{}000  100  010  110  001  101  011  111 。

#include

void printsubset(int set, int count)

/*count: the count of set's elemnts.*/

j >>= 1;

k++;

}printf("}\n");}}

int main()

;printsubset(a, 5);

return 0; }

遞迴的思想是當乙個集合只有1個元素是,集合的子集合就是元素本身。如果集合的元素個數大於1,那麼集合的子集合為:全集 + 出去第乙個元素的集合的所有子集 + 第乙個元素和去除第乙個元素所有子集組合的集合。以遞迴的思想實現要複雜很多,並且當集合元素過多時造成棧溢位。

#include

#include

using namespace std;

set> getsubset(setinput)

else

}return result;

}void printsubset(set> subsets)

printf("}\n");}}

int main()

輸出乙個集合的所有子集

輸出字串的所有子集 如 對 abc 輸出 c b bc a ac ab abc 第一種做法 2 n 遍歷每個字元,每個字元只能取或者不取。取就把該字元加入結果中,遍歷完畢後,輸出結果字串。如下 main.cpp 輸出乙個集合的所有子集 created by zjl on 16 8 10.includ...

如何得到某集合的所有子集合

我們都知道,乙個含n個元素的集合擁有2 n個子集合,並且不難發現,其中每個子集合都是從0到2 n 1 每個數的二進位制格式中0 放棄,1選擇的結果,如下所示 000 100010 110001 101011 111所以根據數字的二進位制轉換,可以輕鬆獲得乙個集合的所有子集合,如下 sub getal...

輸出乙個集合的所有子集(演算法)

輸出乙個集合的所有子集 演算法 時間複雜度很顯然,最少也是2 n,空間複雜度,是n,比較簡單 每個元素要麼在子集中,要麼不在,用 j 的二進位制形式的每一位代表陣列a中對應的位置的元素是否在子集中,例如,當i 5時,j i 5,那麼j 0101 我們對應的輸出 a 0 a 2 這個過程在while迴...