回溯演算法也叫試探法,它是一種系統地搜尋問題的解的方法。回溯演算法的基本思想是:從一條路往前走,能進則進,不能進則退回來,換一條路再試
1、有許多問題,當需要找出它的解集或者要求回答什麼解是滿足某些約束條件的最佳解時,往往要使用回溯法
2、回溯法的基本做法是搜尋,或是一種組織得井井有條的,能避免不必要搜尋的窮舉式搜尋法。這種方法適用於解一些組合數相當大的問題 3、
1、定義乙個解空間,它包含問題的解
2、利用適於搜尋的方法組織解空間
3、利用深度優先法搜尋解空間
4、利用限界函式避免移動到不可能產生解的子空間
問題的解空間通常是在搜尋問題的解的過程中動態產生的,這是回溯演算法的乙個重要特性
•問題的解向量:回溯法希望乙個問題的解能夠表示成乙個n元式
(x1,x2,…,
xn)的形式
•顯約束:對分量
xi的取值限定 •
隱約束:為滿足問題的解而對不同分量之間施加的約束 •
解空間:對於問題的乙個例項,解向量滿足顯式約束條件的所有多元組,構成了該例項的乙個解空間
注意:同乙個問題可以有多種表示,有些表示方法更簡單,所需表示的狀態空間更小(儲存量少,搜尋方法簡單)
n=3時的0-1揹包問題用完全二叉樹表示的解空間:
n=3時的0-1揹包問題用完全二叉樹(子集樹)表示的解空間
深度優先的問題狀態生成法:如果對乙個擴充套件結點
r,一旦產生了它的乙個兒子
c,就把
c當做新的擴充套件結點。在完成對子樹c(以
c為根的子樹)的窮盡搜尋之後,將
r重新變成擴充套件結點,繼續生成
r的下乙個兒子(如果存在)
回溯法:為了避免生成那些不可能產生最佳解的問題狀態,要不斷地利用限界函式
(bounding function)
來處死那些實際上不可能產生所需解的活結點,以減少問題的計算量。
具有限界函式的深度優先生成法稱為回溯法
(1)針對所給問題,定義問題的解空間
(2)確定易於搜尋的解空間結構
(3)以深度優先方式搜尋解空間,並在搜尋過程中用剪枝函式避免無效搜尋
常用剪枝函式:
約束函式:在擴充套件結點處剪去不滿足約束的子樹
限界函式:剪去得不到最優解的子樹。
用回溯法解題的乙個顯著特徵是在搜尋過程中動態產生問題的解空間。在任何時刻,演算法只儲存從根結點到當前擴充套件結點的路徑。如果解空間樹中從根結點到葉結點的最長路徑的長度為
h(n)
,則回溯法所需的計算空間通常為
o(h(n))
。而顯式地儲存整個解空間則需要
o(2h(n))或
o(h(n)!)
記憶體空間
回溯法對解空間作深度優先搜尋,因此,在一般情況下用遞迴方法實現回溯法
// 針對n叉樹的遞迴回溯方法
void backtrack (int t) else }}
}
採用樹的非遞迴深度優先遍歷演算法,可將回溯法表示為乙個非遞迴迭代過程
// 針對n叉樹的迭代回溯方法
void iterativebacktrack ()
else t++;// 未找到,向更深層次遍歷}}
} else t--;}}
回溯發解決問題的關鍵在於如何定義問題的解空間,轉化成樹(即解空間樹),解空間樹分為兩種:子集樹和排列樹
遍歷子集樹需
o(2n
)計算時間
}遍歷排列樹需要
o(n!)
計算時間
經典演算法 回溯演算法
回溯是遍歷搜尋空間所有可能組態的方法。這些組態也許代表物件的所有排列或這是構建物件集合的所有可能的方法 子集 其他情況包括列舉乙個圖的所有生成樹,兩個節點的所有路徑或是把節點分類成不同顏色的所有不同的方式。這些問題有乙個共同的難點就是我們必須每次產生乙個可能的組態。避免重複或遺漏組態的方法就是我們必...
學習演算法 回溯演算法
回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。便於解決樹形問題的情況,比如選擇子串行的問題,尋找路徑等 當出現重複情況或不滿足條件的時候退出 模板publ...
回溯 leetcode回溯演算法
回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,...