日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

五大常用算法之四:回溯法

發(fā)布時(shí)間:2024/4/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 五大常用算法之四:回溯法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741376.html

1、概念

????? 回溯算法實(shí)際上一個(gè)類似枚舉的搜索嘗試過程,主要是在搜索嘗試過程中尋找問題的解,當(dāng)發(fā)現(xiàn)已不滿足求解條件時(shí),就“回溯”返回,嘗試別的路徑。

?? 回溯法是一種選優(yōu)搜索法,按選優(yōu)條件向前搜索,以達(dá)到目標(biāo)。但當(dāng)探索到某一步時(shí),發(fā)現(xiàn)原先選擇并不優(yōu)或達(dá)不到目標(biāo),就退回一步重新選擇,這種走不通就退回再走的技術(shù)為回溯法,而滿足回溯條件的某個(gè)狀態(tài)的點(diǎn)稱為“回溯點(diǎn)”。

???? 許多復(fù)雜的,規(guī)模較大的問題都可以使用回溯法,有“通用解題方法”的美稱。

2、基本思想

?? 在包含問題的所有解的解空間樹中,按照深度優(yōu)先搜索的策略,從根結(jié)點(diǎn)出發(fā)深度探索解空間樹。當(dāng)探索到某一結(jié)點(diǎn)時(shí),要先判斷該結(jié)點(diǎn)是否包含問題的解,如果包含,就從該結(jié)點(diǎn)出發(fā)繼續(xù)探索下去,如果該結(jié)點(diǎn)不包含問題的解,則逐層向其祖先結(jié)點(diǎn)回溯。(其實(shí)回溯法就是對(duì)隱式圖的深度優(yōu)先搜索算法)。

?????? 若用回溯法求問題的所有解時(shí),要回溯到根,且根結(jié)點(diǎn)的所有可行的子樹都要已被搜索遍才結(jié)束。

?????? 而若使用回溯法求任一個(gè)解時(shí),只要搜索到問題的一個(gè)解就可以結(jié)束。

3、用回溯法解題的一般步驟:

??? (1)針對(duì)所給問題,確定問題的解空間:

??????????? 首先應(yīng)明確定義問題的解空間,問題的解空間應(yīng)至少包含問題的一個(gè)(最優(yōu))解。

??? (2)確定結(jié)點(diǎn)的擴(kuò)展搜索規(guī)則

??? (3)以深度優(yōu)先方式搜索解空間,并在搜索過程中用剪枝函數(shù)避免無效搜索。

4、算法框架

???? (1)問題框架

????? 設(shè)問題的解是一個(gè)n維向量(a1,a2,………,an),約束條件是ai(i=1,2,3,…..,n)之間滿足某種條件,記為f(ai)。

???? (2)非遞歸回溯框架

1: int a[n],i; 2: 初始化數(shù)組a[]; 3: i = 1; 4: while (i>0(有路可走) and (未達(dá)到目標(biāo))) // 還未回溯到頭 5: { 6: if(i > n) // 搜索到葉結(jié)點(diǎn) 7: { 8: 搜索到一個(gè)解,輸出; 9: } 10: else // 處理第i個(gè)元素 11: { 12: a[i]第一個(gè)可能的值; 13: while(a[i]在不滿足約束條件且在搜索空間內(nèi)) 14: { 15: a[i]下一個(gè)可能的值; 16: } 17: if(a[i]在搜索空間內(nèi)) 18: { 19: 標(biāo)識(shí)占用的資源; 20: i = i+1; // 擴(kuò)展下一個(gè)結(jié)點(diǎn) 21: } 22: else 23: { 24: 清理所占的狀態(tài)空間; // 回溯 25: i = i –1; 26: } 27: }

??????? (3)遞歸的算法框架

???????? 回溯法是對(duì)解空間的深度優(yōu)先搜索,在一般情況下使用遞歸函數(shù)來實(shí)現(xiàn)回溯法比較簡(jiǎn)單,其中i為搜索的深度,框架如下:

?

1: int a[n]; 2: try(int i) 3: { 4: if(i>n) 5: 輸出結(jié)果; 6: else 7: { 8: for(j = 下界; j <= 上界; j=j+1) // 枚舉i所有可能的路徑 9: { 10: if(fun(j)) // 滿足限界函數(shù)和約束條件 11: { 12: a[i] = j; 13: ... // 其他操作 14: try(i+1); 15: 回溯前的清理工作(如a[i]置空值等); 16: } 17: } 18: } 19: }

?

總結(jié)

以上是生活随笔為你收集整理的五大常用算法之四:回溯法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。