C++ : 二进制法生成子集
生活随笔
收集整理的這篇文章主要介紹了
C++ : 二进制法生成子集
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? 一個有 n 個元素的集合 (n >=0,n為整數),可以生成 2^n個子集。例如 {a,b} 可以生成4個子集? ? {空}、{a},{b}{a,b}
二進制法就是 從0到 2^n用二進制表示,為1的對應的數組位置元素 納入子集集合。
例如? ?a = {a,b,c,d}? 有 16?個子集,建立如下表
| 十進制數 | 二進制數 | 1對應的數組元素 | 結果集 |
| 0 | 0000 | ? | 空 |
| 1 | 0001 | a[3] | d |
| 2 | 0010 | a[2] | c |
| 3 | 0011 | a[2], a[3] | c,d |
| 4 | 0100 | a[1] | b |
| 5 | 0101 | a[1],a[3] | b,d |
| 6 | 0110 | a[1],a[2] | b,c |
| 7 | 0111 | a[1],a[2],a[3] | b,c,d |
| 8 | 1000 | a[0] | a |
| 9 | 1001 | a[0],a[3] | a,d |
| 10 | 1010 | a[0],a[2] | a,c |
| 11 | 1011 | a[0],a[2],a[3] | a,c,d |
| 12 | 1100 | a[0],a[1] | a,b |
| 13 | 1101 | a[0],a[1],a[3] | a,b,d |
| 14 | 1110 | a[0],a[1],a[2] | a,b,c |
| 15 | 1111 | a[0],a[1],a[2],a[3] | a,b,c,d |
?
?
/*** <p> 獲取所有子集* @tparam ElemType 返回值類型* @tparam _InputIterator 線性表的迭代器類型* @param _first1 線性表的起始地址* @param _last1 線性表的結束地址* @param _null 用變量來指定返回值類型避免編譯不過* @return 所有子集*/template<class ElemType,class _InputIterator>vector<vector<ElemType>> makeSubset(_InputIterator _first1, _InputIterator _last1, ElemType _null ){int n = _last1 - _first1;vector<vector<ElemType>> ret;// 2的n次方 1<<nfor(int s=0;s<(1<<n);s++) {vector<ElemType> subRet;for (int i = 0; i < n; i++) {if (s & (1 << i)) //1左移i位,監測s的哪一位為1,為1的話輸出{subRet.push_back(*(_first1 + i)); // std::cout<<i;}}ret.push_back(subRet); // std::cout << std::endl;}return ret;}調用示例:
#include<algorithm> #include<iostream> using namespace std; int main(){string aaaa[3]={"7a8","2b2","3c1"};string string1;vector<vector<string>>aaRet= makeSubset(aaaa, aaaa + 3, string1);for (int j = 0; j < aaRet.size(); ++j) {cout<<"{";for (int i = 0; i < aaRet[j].size(); ++i) {cout<< aaRet[j][i] <<" ";}cout<<"}\n";}}?
{}
{7a8 }
{2b2 }
{7a8 2b2 }
{3c1 }
{7a8 3c1 }
{2b2 3c1 }
{7a8 2b2 3c1 }
?
?
?
總結
以上是生活随笔為你收集整理的C++ : 二进制法生成子集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ : STL常用算法: inner
- 下一篇: 内部排序选择、冒泡、插入、希尔、快速、归