從回溯演算法到分治界限演算法比較最大問題和最小問題

2021-09-24 05:57:51 字數 1693 閱讀 3924

回溯法:

分支界限

當採用佇列時,與回溯一樣,可以一定程度的剪掉一部分的解空間子樹。此時遍歷方式為廣度優先

當採用最優佇列時,可以最大程度的「剪掉」更可能多的解空間子樹,此事遍歷方式為廣度優先結合深度優先

原因:但是值得注意,由於其他層的父節點的上限大於各自的兒子節點和孫子節點等的上限,所以只要最底下一層被取出乙個節點,就代表這是整棵解空間樹的最大的上限的解,也等效最大裝載量的解,最底層再也沒有比這個節點大的上限,哪怕它還沒被加入優先佇列。

下面以0/1揹包問題、最大裝載問題、旅行商問題、流水線排程問題比較回溯演算法分治界限演算法的兩種形式。

給定n個貨物,及其對應的重量w1,w2…wn-1,wn,再載給定乙個最大限重量w。求在不超過限重量的情況下最大裝載量。

(1)回溯演算法:

//r是全域性變數

backtrackloading(int i)

r = r + w[ i ];

}}

(2)分治演算法

void addlivenode(q, e, b , ch, i )  //新增活結點

int maxcostloading()

for(int j=n; j >= 1; j++)

return cw;

}

(2)完整**:

#include#include#includeusing namespace std;

#define n 20

#define num 100000

typedef struct livenode

livenode, *pnode;

int n;

int w;

int w[n];

int bestx[n];

livenode buffer[num]; /*!!為節點提供記憶體!!*/

int head = 0;

struct comp

~comp() {}

bool operator()(pnode x, pnode y)

};priority_queue, comp> q;

/*!!其中,第二個引數為容器型別。第三個引數為比較函式。*/

void scanff();

void addlivenode(pnode pe, int b , char ch, int i); //新增活結點

int maxcostloading();

int main()

void scanff()

int maxcostloading()

/*!!思考為什麼只要取出解空間樹最下一層的乙個節點就可以停止了*/

while( i != n+1)

for(int j=n; j >= 1; j--)

return cw;

}void addlivenode(pnode pe, int b , char ch, int i ) //新增活結點

從分治演算法到 Hadoop MapReduce

要說 hadoop mapreduce 就不得不說分治演算法,而分治演算法其實說白了,就是四個字分而治之。其實就是將乙個複雜的問題分解成多組相同或類似的子問題,對這些子問題再分,然後再分。直到最後的子問題可以簡單得求解。要具體介紹分治演算法,那就不得不說乙個很經典的排序演算法 歸併排序。這裡不說它的...

回溯演算法,從入門到精通

回溯演算法在資料結構中式一種常用的演算法,也是一種暴力求解法,基本思想是深度遍歷,選擇一條路一步一步走,當走不通的時候或者已經求的正確的結果,返回上一步,接著選擇另一條路走,直到遍歷完所有節點。回溯演算法是一種思想,真正用 實現的時候,大多時候都需要用的方法是遞迴。一.回溯演算法最出名的是8皇后問題...

從模型到演算法 目錄

出於對資料分析 資料探勘方面的興趣,以及在未來工作上的幫助。本博打算多看一些相關書籍與部落格,總結及翻譯相應的知識點。使得自己對這塊的知識越來越了解,總結的文章初步分為以下章節 第一章,eda 資料探索 第二章,線性回歸與模型診斷 第三章,從線性概率模型到廣義線性模型 第四章,模型中特徵子集的選擇 ...