求子集問題演算法分析與實現(遞迴、非遞迴)
問題描述:
若有數字集合{1,2,3},則其子集為NULL、{1}、{2}、{3}、{1,2}、{1,3}、{2,3}、{1,2,3}。現給定陣列,求其的全部子集。
實現如下:
//非遞迴
//{1,2,3}
// 0 0 0
// 0 0 1
// 0 1 0
// 0 1 1
// 1 0 0
// 1 0 1
// 1 1 0
// 1 1 1
//計運算元集的個數,即2的元素個數次方
//一次規律
//空集需要特殊輸出
class Solution
{
public:
void subset(int *value, int size)
{
if (value == NULL || size < 1 ) return;//防禦性動作
int *tmp = (int *)malloc(size * sizeof(int));//開闢空間存放輸出標誌
assert(tmp != NULL);
memset(tmp, 0, size*sizeof(int));
int num = (int)pow((double)2, (double)size);//計運算元集個數
cout << "NULL" << endl;
for (int i = 1; i < num; ++i)
{
for (int j = 0; j < size; ++j)//給輸出標誌賦值,二進位制計算
{
if (tmp[j] == 1) tmp[j] = 0;//逢二進一
else if (tmp[j] == 0)
{
tmp[j] = 1;
break;
}
}
for (int j = 0; j < size; ++j)//比較輸出標誌,得出子集所包含元素
{
if (tmp[j] == 1) cout << value[j] << " ";
}
cout << endl;
}
delete tmp;//釋放記憶體空間
}
};
//遞迴
class Solution
{
public:
int *tmp;//指向動態陣列的指標
void createArray(int size)//建立動態陣列
{
tmp = (int *)malloc(size * sizeof(int));
assert(tmp != NULL);
memset(tmp, 0, size * sizeof(int));
}
void deleteArray()//釋放記憶體空間
{
free(tmp);
}
void subsetRecursive(int *value, int m, int size)
{
if (m == -1)//此時標誌位都已賦值,進行統計輸出
{
for (int i = size - 1; i >= 0; --i)
{
if (tmp[i] == 1) cout << value[i] << " ";//為1輸出
}
cout << endl;
}
else
{
tmp[m] = 0;//先將此標誌位賦值為0,即不輸出
subsetRecursive(value, m - 1, size);//遞迴到下一位
tmp[m] = 1;//再將此標誌位賦值為1,即輸出
subsetRecursive(value, m - 1, size);//遞迴到下一位
}
}
void subset(int *value, int size)
{
if (value == NULL || size < 1) return;//防禦性動作
createArray(size);
subsetRecursive(value, size - 1, size);//從最高位開始
deleteArray();
}
};
結果如圖:
相關推薦
求子集問題演算法分析與實現(遞迴、非遞迴)
問題描述: 若有數字集合{1,2,3},則其子集為NULL、{1}、{2}、{3}、{1,2}、{1,3}、{2,3}、{1,2,3}。現給定陣列,求其的全部子集。 實現如下: //非
Java排序演算法分析與實現:快排、氣泡排序、選擇排序、插入排序、歸併排序(一)
轉載 https://www.cnblogs.com/bjh1117/p/8335628.html 一、概述: 本文給出常見的幾種排序演算法的原理以及java實現,包括常見的簡單排序和高階排序演算法,以及其他常用的演算法知識。 簡單排序:氣泡排序、選擇排序、
《推薦系統》基於使用者和Item的協同過濾演算法的分析與實現(Python)
開啟微信掃一掃,關注《資料與演算法聯盟》1:協同過濾演算法簡介2:協同過濾演算法的核心3:協同過濾演算法的應用方式4:基於使用者的協同過濾演算法實現5:基於物品的協同過濾演算法實現一:協同過濾演算法簡介 關於協同過濾的一個最經典的例子就是看電影,有時候不知道哪一部電影是
漢諾塔非遞迴演算法分析與實現
漢諾塔的遞迴演算法很容易理解,也非常容易實現。下面,本文討論了漢諾塔問題的非遞迴演算法,核心內容就是棧的使用技巧。 首先,對於每個柱子來說,就是一個棧,這個棧有個特點就是,大數放在下面,小數放在上面。在首次建立棧時,我們可以先儲存好這些資料,假設最小的盤子序號
Java排序算法分析與實現:快排、冒泡排序、選擇排序、插入排序、歸並排序(二)
第一個元素 spa insert 循環 冒泡排序 author 高級算法 ins -s 一、概述: 上篇博客介紹了常見簡單算法:冒泡排序、選擇排序和插入排序。本文介紹高級排序算法:快速排序和歸並排序。在開始介紹算法之前,首先介紹高級算法所需要的基礎知識:劃分、遞歸,並順
演算法分析與設計(一)
一、演算法的定義 滿足五個條件:可行性、確定性、輸入、輸出、有窮性 滿足前四個條件為計算過程(OS) 二、演算法複雜性分析 時間複雜性:對該輸入需要產生的原子操作的步數(是輸入大小的函式) 空間複雜性:演算法所需要的儲存空間 三、計算複雜性函式的階 階:描述增長
演算法導論-最大子陣列問題-線性時間複雜度演算法分析與實現
之前寫了最大子陣列問題的分治法,今天把這個問題的線性時間複雜度的演算法寫出來。 這個方法在演算法導論最大子陣列問題的課後思考題裡面提出來了,只是說的不夠詳細。 思考題如下:使用如下思想為最大子陣列問題設計一個非遞迴的,線性時間複雜度的演算法。從陣列左邊界開始,由左至右處理,
knn演算法原理與實現(1)
一、演算法原理與模型 knn演算法即最近鄰演算法,其原理非常簡單即根據給定的資料集,計算資料集中點的特徵到待分類資料的歐氏距離,然後選擇距離最近的k個作為判斷依據,這k個數據中出現類別最多的作為新輸入資料的label。模型用公式表示如下: 二、python程式碼實現
最短路徑演算法—Floyd(弗洛伊德)演算法分析與實現(Python)
December 19, 2015 10:56 PM Floyd演算法是解決任意兩點間的最短路徑的一種演算法,可以正確處理帶權有向圖或負權的最短路徑問題 解決此問題有兩種方法: 其一是分別以圖中每個頂點為源點共呼叫n次演算法; 其二是採用Floyd演算法
最短路徑演算法—Dijkstra(迪傑斯特拉)演算法分析與實現(Python)
December 18, 2015 12:56 PM Dijkstra(迪傑斯特拉)演算法是典型的最短路徑演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法能得出最短路徑的
最短路徑演算法—Dijkstra(迪傑斯特拉)演算法分析與實現(C/C++)
Dijkstra(迪傑斯特拉)演算法是典型的最短路徑路由演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。 Dijks
LRU快取淘汰演算法分析與實現
概述 記錄一下LRU快取淘汰演算法的實現。 原理 LRU(Least recently used,最近最少使用)快取演算法根據資料最近被訪問的情況來進行淘汰資料,其核心思想是“如果資料最近被訪問過,那麼將來被訪問的機率也更高”。 介紹 下圖中,介紹
演算法分析與設計(四)動態規劃(二)
動態規劃的概念複習 每次決策依賴於當前狀態,又隨即引起狀態的轉移。一個決策序列就是在變化的狀態中產生的,所以,這種多階段最優化決策解決問題的過程就稱為動態規劃。 動態規劃的思想和策略 將待求解的問題分解為若干個子問題,按順序求解子階段,前一子問題的解,為後
最短路徑演算法—Dijkstra(迪傑斯特拉)演算法分析與實現(C/C++)及其他 + leetcode習題實踐
最短路徑求解 最短路徑的常用解法有迪傑克斯特拉演算法Dijkstra Algorithm, 弗洛伊德演算法Floyd-Warshall Algorithm, 和貝爾曼福特演算法Bellman-Ford Algorithm,其中,Floyd演算法是多源最短路徑,即求
music演算法分析與實現
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255);">1 、MUSIC演算法</spa
排序演算法—選擇排序演算法分析與實現(Python)
December 23, 2015 12:31 PM 思想 選擇排序的思想非常直接,不是要排序麼?那好,我就從所有序列中先找到最小的,然後放到第一個位置。之後再看剩餘元素中最小的,放到第二個位置……以此類推,就可以完成整個的排序工作了。可以很清楚的發現,選擇
HMM-前向後向演算法理解與實現(python)
[TOC] ### 基本要素 - 狀態 $N$個 - 狀態序列 $S = s_1,s_2,...$ - 觀測序列 $O=O_1,O_2,...$ - $\lambda(A,B,\pi)$ - 狀態轉移概率 $A = \{a_{ij}\}$ - 發射概率 $B = \{b_{ik}\}$
HMM-維特比演算法理解與實現(python)
[HMM-前向後向演算法理解與實現(python)](https://www.cnblogs.com/gongyanzh/p/12880387.html) [HMM-維特比演算法理解與實現(python)]() --- ### 解碼問題 - 給定觀測序列 $O=O_1O_2...O_T$,模型 $\lamb
分散式系統限流演算法分析與實現
一、限流的關鍵作用 對於大型網際網路架構中,限流的設計是必不可少的一個環節。在給定的時間內, 客戶端請求次數過多, 伺服器就會攔截掉部分請求,避免請求流量過大造成資料庫負載高的問題。 二、常見限流演算法利弊分析 計數器限流 計數器限流主要有固定視窗計數器和滑動視窗計數器。固定視窗計數器即:在單位
二叉樹的遍歷方式(遞迴、非遞迴)——Java實現
二叉樹作為一種常用的資料結構,也是面試經常被問到的知識點,瞭解二叉樹的結構和性質也是很有必要的,對於眾多的樹結構,二叉樹只是入門的一種,先把二叉樹理解通透,再深入學習時,會更簡單一些。 二叉樹的性質: (1) 在非空二叉樹中,第i層的結點總數不超過 , i>=1;