青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 51, 文章 - 1, 評論 - 41, 引用 - 0
數據加載中……

從集合中枚舉子集

在很多算法中需要從一個集合中枚舉可能的子集。特別在一些窮舉算法中,需要枚舉每種可能的子集,從而計算出最優解。本文將討論一種把子集映射N進制數字的枚舉方法。

從集合中枚舉子集有許多種情況。這里集合是指廣義的,它可能包含相同的元素。先討論不含相同元素的集合,枚舉問題規定如下:從N個元素的集合中,取出R的元素子集。根據子集的不同性質可分為:

子集是否可以重復包含某元素

子集的元素是否有序。

上面兩種情況自由組合可分為4種情形,見下表:

條件一

條件二


可以重復包含

有序

1

無序

2

不可重復包含

有序

3

無序

4

表一

1:按照這4種情況,枚舉集合{ab,c},其中R=2

情況1:有{a,a}{ab},{ac},{ba},{bb}{b,c}{ca},{cb}{c,c}9種。

情況2:有{aa},{bb}{cc},{ab}{a,c},{b,a}6種。

情況3:有{a,b},{a,c},{b,a},{b,c},{c,a},{c,b}6種。

情況4:有{a,b},{a,c},{b,a}3種。

下面討集合包含相同元素,這里的相同元素視為完全等同,可以替換。這樣集合含有兩個信息,一是含有N各不同的元素,二是每種元素有多少個。如果每種元素的個數為1,就是上面討論的情況。這里增加了新的討論條件,子集重復包含某元素的個數是否可以超過集合中該元素的個數。上一種情況,重復包含就意味超過。而在這里,就要分情況處理。

可以重復包含,可以超過

有序

1

無序

2

不可重復包含

有序

3

無序

4

可以重復包含,不可以超

有序

5

無序

6

表二

2:按照這6種情況,枚舉集合{a,ab,c},其中R=2

情況1:有{a,a}{a,b},{a,c},{b,a},{b,b},{b,c},{c,a}{c,b}{c,c}9種。

情況2:有{a,a}{b,b},{c,c}{a,b},{a,c}{b,a}6種。

情況3:有{a,b}{a,c},{b,a}{b,c},{c,a},{c,b}6種。

情況4:有{a,b},{a,c}{b,a}3種。

情況5:有{a,a},{ab},{a,c},{ba},{b,c},{ca},{c,b}7種。

情況6:有{aa},{a,b}{a,c},{b,a}4種。

比較例1和例2發現情況12,3,4結果一樣,其實在可以超過的條件下,集合某個元素的個數是不起限制作用,結果也就一樣。所以可合并這兩種情況。從分析中知道,枚舉這樣的集合需要知道兩類信息。N種不同的元素和每種元素個數。N種不同的元素可以映射到0至(N-1N整數上。問題就變成了枚舉N個整數。枚舉出來的數字可以映射到原先的元素。N和表示每種元素個數的數組就是需要的信息。

// 構造函數
// 輸入參數:max表示集合元素的個數
// 輸入參賽:ele_num 表示第i個元素的個數
CSetIter::CSetIter(unsigned 
long max, const std::vector<int>& ele_num) :
    m_ele_num(ele_num)
{
    assert(max 
== ele_num.size());
    m_max 
= max;
}


枚舉
R個元素就是取R個數,每個數的取值0至(N-1。這樣每個子集對應一個RN進制的數。于是枚舉數0到NR-1,就枚舉出每種可能的子集,然后判斷子集是否滿足條件。

// 得到下一個子集合
// 輸出參數:subset得到的子集合
// 返回值:1表示成功取得,0表示沒有取得,枚舉完畢
int CSetIter::GetNextSubset(std::vector<int>& subset)
{

    assert(subset.size() 
== m_size);
    
while (m_iter_num < m_iter_max)
    {
        
// 判斷是否符合條件
        
if ((this->*m_pfnIsSubsetOk)(m_iter_v))
        {
            subset 
= m_iter_v;
            IncIterNum();
            return 
1;
        }
        IncIterNum();
    }
    return 
0;
}


下面分別討論這六種情況如何判斷。

情況1:每個枚舉數都滿足要求。

// 子集合是否滿足可重復,有序條件
// 輸出參數:subset得到的子集合
// 返回值:1表示符合,0表示不符合
int CSetIter::IsMultOrdered(std::vector<int>& subset)
{
    return 
1;
}


情況
2:枚舉數高位的數字不大于低位的數字。

// 子集合是否滿足可重復,無序條件
// 輸出參數:subset得到的子集合
// 返回值:1表示符合,0表示不符合
int CSetIter::IsMultDisorder(std::vector<int>& subset)
{
    
for (int i=0; i<m_size-1; i++)
    {
        
if (subset[i] > subset[i+1])
            return 
0;
    }
    return 
1;
}


情況
3枚舉數的各位數字不能相同。

// 子集合是否滿足不重復,有序條件
// 輸出參數:subset得到的子集合
// 返回值:1表示符合,0表示不符合
int CSetIter::IsSingleOrdered(std::vector<int>& subset)
{
    
for (int i=0; i<m_size-1; i++)
    {
        
for (int j=i+1; j<m_size; j++)
        {
            
if (subset[i] == subset[j])
                return 
0;
        }
    }
    return 
1;
}


情況4:枚舉數高位的數字小于低位的數字。

// 子集合是否滿足不重復,無序條件
// 輸出參數:subset得到的子集合
// 返回值:1表示符合,0表示不符
int CSetIter::IsSingleDisorder(std::vector<int>& subset)
{
    
for (int i=0; i<m_size-1; i++)
    {
        
if (subset[i] >= subset[i+1])
            return 
0;
    }
    return 
1;
}


情況
5數字在枚舉數出現的次數不能超過該數字對應元素的個數。

// 子集元素重復,有序,不能超出集合
// 輸出參數:subset得到的子集合
// 返回值:1表示符合,0表示不符
int CSetIter::IsMultOrderedIn(std::vector<int>& subset)
{
    std::vector
<int> tmp(m_ele_num.size(), 0);
    
for (int i=0; i<m_size; i++)
    {
        tmp[subset[i]]
++;
        
if (tmp[subset[i]] > m_ele_num[subset[i]])
            return 
0;
    }
    return 
1;
}


情況
6情況5加上情況2。

// 子集元素重復,無序,不能超出集合
// 輸出參數:subset得到的子集合
// 返回值:1表示符合,0表示不符
int CSetIter::IsMultDisorderIn(std::vector<int>& subset)
{
    std::vector
<int> tmp(m_ele_num.size(), 0);
    
for (int i=0; i<m_size-1; i++)
    {
        
if (subset[i] > subset[i+1])
            return 
0;
    }
    
for (int i=0; i<m_size; i++)
    {
        tmp[subset[i]]
++;
        
if (tmp[subset[i]] > m_ele_num[subset[i]])
            return 
0;
    }
    return 
1;
}


其他實現見代碼。

代碼編譯方式:

g++ SetIter.cpp -D_SETITER_TEST_ 編譯,運行??煽吹嚼?/font>1的結果,

g++ SetIter.cpp -D_SETITERAGENT_TEST_ 編譯,運行,就可以看到例2的結果。
 

 

posted on 2007-11-03 12:36 lemene 閱讀(2345) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜免费在线观看精品视频| 欧美韩国日本综合| 农村妇女精品| 久久不射2019中文字幕| 欧美成熟视频| 久久久久国产精品一区| 欧美日韩日日夜夜| 欧美高清视频免费观看| 国产视频一区在线观看| 一区二区三区免费网站| 亚洲巨乳在线| 欧美电影免费观看高清| 亚洲蜜桃精久久久久久久| 亚洲日本乱码在线观看| 久久免费精品视频| 欧美一区视频在线| 国产精品免费一区二区三区在线观看| 亚洲欧洲精品一区二区精品久久久| 久久av一区二区三区| 欧美亚洲在线| 国产精品久久久久久影视| 久久爱另类一区二区小说| 久久久久久久久久久一区 | 国产一区二区剧情av在线| 亚洲图片激情小说| 亚洲免费在线视频| 国产乱人伦精品一区二区 | 免费在线观看一区二区| 亚洲美女精品久久| 日韩小视频在线观看专区| 欧美极品在线播放| 亚洲乱码日产精品bd| 久久婷婷蜜乳一本欲蜜臀| 国产一区二区三区四区五区美女 | 浪潮色综合久久天堂| 极品少妇一区二区三区精品视频 | 日韩午夜在线| 国产亚洲一区二区在线观看| 欧美xxx成人| 久久国产欧美| 亚洲私人影院| 亚洲欧洲一二三| 久久综合精品一区| 先锋影音网一区二区| 99亚洲视频| 国产精品女人久久久久久| 欧美大胆人体视频| 久久99在线观看| 在线视频你懂得一区| 久久久激情视频| 亚洲一级在线观看| 国产在线观看91精品一区| 麻豆av一区二区三区| 亚洲美女免费视频| 亚洲国产高清一区二区三区| 亚洲午夜激情| 亚洲免费观看高清完整版在线观看熊 | 国产综合久久久久影院| 国产精品国产| 久久久久青草大香线综合精品| 欧美激情国产日韩| 久久免费精品视频| 日韩视频免费观看高清在线视频| 国内精品视频一区| 国产午夜精品久久| 国产免费成人av| 国产精品一区=区| 国产精品乱人伦中文| 欧美午夜精品久久久久久久| 久久九九国产精品| 9l国产精品久久久久麻豆| 久久久噜噜噜久噜久久 | 久久精品亚洲国产奇米99| 亚洲免费在线播放| 欧美激情视频在线播放| 免费人成精品欧美精品| 午夜精品一区二区三区在线| 亚洲直播在线一区| 亚洲日本乱码在线观看| 亚洲精品婷婷| 亚洲神马久久| 99www免费人成精品| 一区二区欧美精品| 亚洲国产另类精品专区| 国产日韩欧美精品| 国产亚洲在线| 亚洲第一页中文字幕| 国产女主播一区二区三区| 欧美久久久久久久| 久久综合伊人77777麻豆| 午夜精品一区二区三区四区 | 久久午夜影视| 欧美成人在线网站| 欧美日韩在线高清| 国产精品自拍视频| 精品成人一区二区| 亚洲精品国产视频| 亚洲一区二区久久| 久久久久久久综合日本| 模特精品在线| 蜜臀av性久久久久蜜臀aⅴ四虎 | 欧美一区国产二区| 欧美波霸影院| 亚洲最快最全在线视频| 午夜在线电影亚洲一区| 美女黄色成人网| 国产精品成人免费| 亚洲大片精品永久免费| 亚洲视频精品| 久久综合九色| 亚洲视频日本| 老司机免费视频一区二区| 国产精品v欧美精品∨日韩| 国内自拍一区| 红桃视频国产一区| 99香蕉国产精品偷在线观看| 久久九九国产| 一道本一区二区| 久久精品视频一| 国产精品久久7| 在线精品视频一区二区| 亚洲一区日本| 亚洲高清视频中文字幕| 亚洲在线播放| 久久av在线| 欧美午夜电影网| 亚洲国产一区二区三区青草影视| 免费看的黄色欧美网站| 亚洲精品小视频| 久久久久久黄| 国产精品入口夜色视频大尺度| 国产精品分类| 亚洲人人精品| 亚洲一区久久久| 亚洲第一狼人社区| 久久久久久久久岛国免费| 国产精品一二三四| 一区二区免费在线观看| 亚洲第一精品电影| 久久精品成人一区二区三区| 国产精品视频久久| 亚洲天堂av电影| 亚洲国产成人tv| 老巨人导航500精品| 国产中文一区| 校园激情久久| 亚洲综合好骚| 国产精品红桃| 亚洲伊人第一页| 亚洲三级视频在线观看| 亚洲欧美综合另类中字| 欧美大片第1页| 亚洲国内高清视频| 欧美韩日亚洲| 免费成人激情视频| 亚洲国产精品一区二区第一页 | 午夜免费电影一区在线观看| 国产精品美女久久久久久免费| 中文国产成人精品| 亚洲精品在线二区| 欧美日韩在线观看一区二区| 99re在线精品| 99精品国产福利在线观看免费 | 久久精品欧美日韩精品| 亚洲电影在线观看| 久久深夜福利免费观看| 在线国产精品一区| 欧美黑人国产人伦爽爽爽| 久久综合九色九九| 亚洲国产精品热久久| 亚洲国产精品成人一区二区| 欧美在线一二三| 好吊一区二区三区| 久久综合九色| 欧美国产日韩一二三区| 狠狠色丁香婷婷综合影院| 久久久久久国产精品mv| 久久乐国产精品| 亚洲人成网站999久久久综合| 亚洲第一中文字幕| 欧美久久九九| 欧美亚洲综合网| 久久免费视频这里只有精品| 亚洲欧洲日产国产综合网| 亚洲精品在线观看免费| 国产精品五区| 欧美成人午夜77777| 欧美国产综合| 欧美一级电影久久| 久久久激情视频| 亚洲精品一区久久久久久| 亚洲视频狠狠| 精品成人一区二区三区| 亚洲精品裸体| 国产欧美一区二区三区在线老狼 | 亚洲天堂第二页| 亚洲女人天堂成人av在线| 精品av久久707| 一区二区欧美日韩视频| 国产综合在线视频|