集合習題之列出有限集合所有子集

1、題目(《離散數學及其應用》第6版P75 20 題)

??? 給出可以列出有限集合所有子集的步驟。

2、? 解題思路

假設有集合A = {a1, a2 … an},列出其所有子集。

  • 先列出含有1個元素的所有子集:{a1},{a2} … {an}
  • 然后列出含有2個元素的所有子集:{a1,a2},{a1,a3}…{an-1,an}
  • 同上所示,一直列到含有n個元素的所有子集

可以看出,問題就簡化為求在 A 集合中,求含有固定 x 個元素的所有子集(注意,子集中每個ai只能包含一次)。

這實際上類似這么個問題,袋子中有編號為1到10的10個球,每次取一個球,取出后不放回袋子,取3次,問取出的3個球的編號可能的所有組合。

方法:

  • 取第1個球時,有1~10種取法
  • 取第2個球時,如果知道第1個球取的編號是a,則第2個球有除a以外的9種取法,但要注意{1,2}和{2,1}是同一個子集,如何保證不取已經取過了的同一組編號的球?

我們可以觀察到如果讓{1,2}2個球按編號大小排列只有一種排列方式即{1,2},所以只要保證第2個球的編號比第一個球的編號大,即可保證不會取到{2,1}

所以,我們可以在取第2個球時,從 (a+1) 開始取,即可保證不會取到重復的排列方式

同時,我們取第3個球時,一樣需要知道第1、2個球的編號,這實際上就是一個遞歸問題了,假設已知取到第1個球為a,第2個球為b,則第三個球的取法為 {(b+1) …10)}

3、算法

//功能:從m個元素(元素不重復)中取出n個元素(n <= m)的所有取法
//參數:vectorHead = 前nBit_x - 1個元素已取了的頭部vector
//參數:nHeadBit = 當前處理的元素在vectorSet中的位置
//參數:nBit_x = 當前要處理的子集的元素位置
//參數:nChildSetSize= 要取的n個元素的子集的大小
//參數:vectorSet = m個元素的總集
//參數:vectorChildSetBuffer = 存放子集的buffer
//返回:當前操作的步數
int    GetChildSetByDec(std::vector<int>& vectorHead, int nHeadBit, int nBit_x, int nChildSetSize, std::vector<int>& vectorSet, std::vector<std::vector<int>>& vectorChildSetBuffer)
{int    nRet  = 0;for (int i = nHeadBit; i < vectorSet.size(); i++){nRet++;std::vector<int>    vectorNewHead = vectorHead;vectorNewHead.push_back(vectorSet[i]);if (nBit_x == nChildSetSize - 1){//如果已經處理到最后一位了,則添加到buffer中
            vectorChildSetBuffer.push_back(vectorNewHead);}else{//如果還沒處理到最后一位,則遞歸GetChildSetByDec(vectorNewHead, i + 1, nBit_x + 1, nChildSetSize, vectorSet, vectorChildSetBuffer);}}return    nRet;
}//功能:從m個元素(元素不重復)中取出n個元素(n <= m)的所有取法
//參數:nChildSize = 要取的n個元素的子集的大小
//參數:vectorBuffer = 存放所有數組的buffer
//參數:vectorSet = m個元素的總集
//返回:無
void    GetChildSet(std::vector<std::vector<int>>& vectorChildSetBuffer, std::vector<int>& vectorSet)
{//依次列出從1個元素到n個元素的集合for (int i = 1; i <= vectorSet.size(); i++){std::vector<int> vectorHead;GetChildSetByDec(vectorHead, 0, 0, i, vectorSet, vectorChildSetBuffer);}
}

?

說明:

  • 這里用的 vectorChildAggregateBuffer 來存放返回的子集,vectorChildAggregateBuffer 是一個STL容器中向量的向量,如果沒有用過STL,可以理解為數組的指針(Array[][]),這里用Vector是為了存儲操作方便。
  • GetChildAggregateByDec() 函數即用遞歸實現上面例子中10個球中取3個球的所有取法遍歷。
  • GetChildAggregateByDec() 中運用了將n個元素映射為 Array[n] 數組一一對應的思想

程序運行結果:

image

?

如有其他思路解題,歡迎大家跟帖討論

轉載于:https://www.cnblogs.com/organic/p/5015246.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272678.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272678.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272678.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# partial 關鍵字的使用

C# 2.0 引入了局部類型的概念。局部類型允許我們將一個類、結構或接口分成幾個部分&#xff0c;分別實現在幾個不同的.cs文件中。局部類型適用于以下情況&#xff1a;(1) 類型特別大&#xff0c;不宜放在一個文件中實現。(2) 一個類型中的一部分代碼為自動化工具生成的代碼&…

oracle中的輸入 amp,Oracle之SQL學習

1.Oracle 更改會話(更改oracle中顯示日期的方式)SQL> alter session set NLS_date_formatYYYY-MM-DD;2.使用綁定變量來輸入記錄(可以重復執行&#xff0c;輸入記錄)&#xff1a;SQL> insert into test1(id,name)2 values(&id, &name);輸入 id 的值: 5輸入 name…

線段的平移和旋轉

//github不會用&#xff0c;試了很久不知道怎么上傳代碼 #include <iostream> using namespace std;#include <stdlib.h> #include <Eigen/Dense> #include <math.h> using namespace std; using Eigen::MatrixXd; int main() { int option; struct p…

我不問+你不說

閱讀原文很多事我不問你不說這就是距離我問了你不說這就是隔閡我問了你說了這就是尊重你想說我想問這就是默契我不問你說了這就是信任很多事情你看到的聽到的未必是你想象的那樣人生在世多給別人機會解釋多些向別人解釋的耐心人生會少很多遺憾不問、不說、不解釋這不是酷或有個…

怎么安裝redhat linux操作系統,紅帽RedHat Linux5系統安裝指南

介紹如何安裝linux操作系統&#xff0c;以目前市場主流的操作系統為例子進行介紹。1、放入安裝dvd光盤&#xff0c;然后啟動服務器&#xff0c;可得如下畫面&#xff1a;2、按enter鍵&#xff0c;進入如下畫面3、選擇skip&#xff0c;按enter進入&#xff0c;下面畫面&#xff…

Net中的Request和Response對象的理解

Request 和 Response 對象起到了服務器與客戶機之間的信息傳遞作用。Request 對象用于接收客戶端瀏覽器提交的數據&#xff0c;而Response 對象的功能則是將服務器端的數據發送到客戶端瀏覽器。一、Request對象的五個集合&#xff1a;QueryString&#xff1a;用以獲取客戶端附在…

研華工控機u盤啟動安裝linux系統,研華工控機怎么設置u盤啟動

本文主要介紹研華IPC如何設置u盤啟動研華IPC-610 IPC隨XP版一起安裝。有時安裝控制軟件需要在不滿意時卸載。卸載未完成&#xff0c;這使得安裝無法進行&#xff0c;因此您需要將系統恢復到相對純粹的時間。通常&#xff0c;USB磁盤啟動盤的安裝系統首先備份初始純XP作為備份&a…

UVA - 11732 strcmp() Anyone?左兄弟右兒子trie

input n 2<n<4000 s1 s2 ... sn 1<len(si)<1000 output 輸出用strcmp()兩兩比較si,sj(i!j)要比較的次數&#xff0c;結果在long long范圍內&#xff08;相同字符比較兩次&#xff0c;不相同字符比較一次&#xff0c;包括\0&#xff09; 做法&#xff1a;由于字符集…

防止SQL注入式攻擊的筆記

SQL注入式攻擊是指利用設計上的漏洞攻擊系統。如果動態生成SQL語句時沒有對用戶輸入的數據進行過濾&#xff0c;便會使SQL注入式攻擊得逞。例如用下面的SQL語句判斷用戶名和密碼&#xff1a;txtsql"select * from user_info where userid"&txtuserid &"…

linux輸入一個用戶看是否在工作,linux下的用戶管理詳解

linux下的用戶管理詳解useradd 命令詳解添加用戶想要對linux下面的帳號了解的話首先必須要了解的4個配置文件[rootlocalhost /]# cat /etc/passwd首先我們需要了解的是用戶帳號的配置信息/etc/passwd里面的內容每個字段都以:分割&#xff0c;下面我們詳細的看看每個字段的意思r…

Java命令學習系列(零)——常見命令及Java Dump介紹

Java命令學習系列&#xff08;零&#xff09;——常見命令及Java Dump介紹 一、常用命令&#xff1a; 在JDK的bin目彔下,包含了java命令及其他實用工具。 ? jps:查看本機的Java中進程信息。 ? jstack:打印線程的棧信息,制作線程Dump。 ? jmap:打印內存映射,制作堆Dump。 ? …

優秀程序員的十個習慣

在這個世界上&#xff0c;有數百萬的人熱衷于軟件開發&#xff0c;他們有很多名字&#xff0c;如&#xff1a;軟件工程師&#xff08;Software Engineer&#xff09;&#xff0c;程序員&#xff08;Programmer&#xff09;&#xff0c;編碼人&#xff08;Coder&#xff09;&…

linux下jmap 內存命令,Linux下jmap命令查看內存使用

Linux下jmap命令查看內存使用jmap -heap 1234(1234為進程號)jmap是JDK自帶的一個工具&#xff0c;非常小巧方便&#xff0c;其支持參數如下&#xff1a;-heap打印heap空間的概要&#xff0c;這里可以粗略的檢驗heap空間的使用情況。例&#xff1a;jmap -heap 12345輸出&#xf…

BZOJ3144: [Hnoi2013]切糕

題目&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id3144 把每一條z軸都拿出來&#xff0c;s->(x,y,1),cf[x][y][1];(x,y,k)->(x,y,k1),cf[x][y][k];(x,y,r)->t,cinf 然后對于四聯通的點&#xff0c;(x,y,z)->(x,y’,z-d) 似乎這叫經典的最小割模型…

如何通俗地解釋 C、C++、C#、Java、JavaScript、HTML、Python的用處

世界上本來沒有計算機&#xff0c;工程師創造了它。為了讓告訴計算機需要做什么事情&#xff0c;工程師發明了程序設計語言。簡單粗暴的編程&#xff1a;C語言&#xff1a;用來學編程&#xff1b;C語言&#xff1a;用來使勁兒學編程&#xff1b;C#&#xff1a;用來在windows操作…

安卓linux交叉編譯,Linux Ubuntu下用Android NDK 生成獨立交叉編譯鏈

本文主要介紹使用Android NDK生成獨立交叉編譯鏈&#xff0c;然后使用獨立交叉編譯鏈編譯Android程序下載NDK下載與自己操作系統相吻合的版本 下載地址解壓到安裝目錄(如~/myndk):tar -zxvf android-ndk-r14b-linux-x86_64將NDK的根目錄生成一個環境變量打開~/.bashrcw文件&…

數據結構——各排序算法的比較

1.從時間復雜度比較   從平均時間復雜度來考慮&#xff0c;直接插入排序、冒泡排序、直接選擇排序是三種簡單的排序方法&#xff0c;時間復雜度都為O(n2)&#xff0c;而快速排序、堆排序、二路歸并排序的時間復雜度都為O(nlog2n)&#xff0c;希爾排序的復雜度介于這兩者之間。…

將c程序移植到linux,各位大俠:我把原來在linux運行的c程序移植到HPUNIX上出現了錯誤...

各位大俠&#xff1a;我把原來在linux運行的c程序移植到HPUNIX上出現了錯誤(2012-04-11 00:43:47)標簽&#xff1a;linuxc程序雜談各位大俠&#xff1a;我把原來在linux運行的c程序移植到HP_UNIX上出現了錯誤makefileCC aCC -AA W829 DD64 DAportable-I/ods/app/oracle/produc…

數據庫學習建議之提高數據庫速度的十條建議

很多網站的重要信息都是保存在數據庫中的&#xff0c;用戶通過提交訪問數據庫來獲取用戶信息。如果數據庫速度非常的快&#xff0c;有助于節省服務器的資源&#xff0c;在這篇文章中&#xff0c;我收集了十個優化數據庫速度的技巧。0. 小心設計數據庫第一個技巧也許看來理所當然…

Java中數據類型的取值范圍

整數數據類型的取值范圍 我們都知道計算機的底層是二進制&#xff0c;也知道不同的整數類型存儲值的范圍不同&#xff0c;可這些數值在計算機底層是怎樣存儲的呢&#xff1f;數值范圍又是怎么計算出來的呢&#xff1f; 下面以java來進行舉例&#xff1a; byte 1個字節 (8bit…