天天看點

集合的所有分割方式---2013年1月28日

    問題描述:分割集合成多個子集合,這幾個子集合間沒有交集且他們的并集是原集合。

       思路:将包含n個元素的集合set的分割表示為n個數字。比如set[]={1,2,3,4},那麼{1,2},{3,4}就可以表示為1122,這4個數分别表示set[0]在第一個分割集合,set[1]在第一個分割集合,set[2]在第二個分割集合,set[3]在第二個分割集合。将這個過程稱為編碼。

       然後抓住兩個要點:

       1.第i個元素的編碼一定小于或者等于i。約定一下,set原集合已經從小到大排列好,分割的集合也是這樣排好。然後,很容易了解,第1個元素的編碼肯定為1。接着,第2個元素如果在第一個分割集合中,那麼他的編碼也是1;但如果不是在第一個分割集合中,那麼第2個元素的編碼肯定是2,因為在第二個分割集合中,最小的數最少也是2;依次類推,可以很容易用數學歸納法證明。

       2.第i個元素的編碼一定小于等于1,2,3,....i-1這些元素的編碼中的最大值再加1。這也很容易想到,也很容易用數學歸納法證明。

       抓住這個要點後,就用深度搜尋構造一顆子集合樹就可以解決問題了。但是,我在構造子集樹的過程中出現了一個思維上的錯誤,導緻浪費了不少調試的時間。具體的錯誤見代碼注釋的描述。

       代碼如下:

本文轉自NeilHappy 51CTO部落格,原文連結:http://blog.51cto.com/neilhappy/1127670,如需轉載請自行聯系原作者