1. 程式人生 > >求子集問題演算法分析與實現(遞迴、非遞迴)

求子集問題演算法分析與實現(遞迴、非遞迴)

問題描述:

若有數字集合{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;