http://www.wutianqi.com/?p=1157 集合A的冪集是由集合A的所有子集所組成的的集合。
如:A={1,2,3},則A的冪集P(A)={{1,2,3},{1,2},{1,3},{1},{2,3},{2},{3},{ }}。
求一個(gè)集合的冪集就是求一個(gè)集合的所有的子集,方法有窮舉法,分治法,回溯等,這里主要介紹一下回溯法。
回溯法是設(shè)計(jì)遞歸過(guò)程的一種重要的方法,它的求解過(guò)實(shí)質(zhì)上是一個(gè)先序遍歷一棵“狀態(tài)樹(shù)”的過(guò)程,只是這棵樹(shù)不是遍歷前預(yù)先建立的,而是隱含在遍歷過(guò)程中的。
冪集中的每個(gè)元素是一個(gè)集合,它或是空集,或含集合A中一個(gè)元素,或含集合A中兩個(gè)元素…… 或等于集合A。反之,從集合A 的每個(gè)元素來(lái)看,它只有兩種狀態(tài):它或?qū)賰缂臒o(wú)素集,或不屬冪集的元素集。則求冪集p(A)的元素的過(guò)程可看成是依次對(duì)集合A中元素進(jìn)行“取”或“舍”的過(guò)程,并且可以用一棵二叉樹(shù)來(lái)表示過(guò)程中冪集元素的狀態(tài)變化過(guò)程,樹(shù)中的根結(jié)點(diǎn)表示冪集元素的初始狀態(tài)(空集);葉子結(jié)點(diǎn)表示它的終結(jié)狀態(tài),而第i層的分支結(jié)點(diǎn),則表示已對(duì)集合A中前i-1個(gè)元素進(jìn)行了取舍處理的當(dāng)前狀態(tài)(左分支表示取,右分支表示舍 )。因此求冪集元素的過(guò)程即為先序遍歷這棵狀態(tài)樹(shù)的過(guò)程。
具體算法如下:
C/C++描述: