五大常用演算法之四:回溯演算法
1、概念
回溯演算法實際上一個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。
回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為“回溯點”。
許多複雜的,規模較大的問題都可以使用回溯法,有“通用解題方法”的美稱。
2、基本思想
在包含問題的所有解的解空間樹中,按照深度優先搜尋的策略,從根結點出發深度探索解空間樹。當探索到某一結點時,要先判斷該結點是否包含問題的解,如果包含,就從該結點出發繼續探索下去,如果該結點不包含問題的解,則逐層向其祖先結點回溯。(其實回溯法就是對隱式圖的深度優先搜尋演算法)。
若用回溯法求問題的所有解時,要回溯到根,且根結點的所有可行的子樹都要已被搜尋遍才結束。
而若使用回溯法求任一個解時,只要搜尋到問題的一個解就可以結束。
3、用回溯法解題的一般步驟:
(1)針對所給問題,確定問題的解空間:
首先應明確定義問題的解空間,問題的解空間應至少包含問題的一個(最優)解。
(2)確定結點的擴充套件搜尋規則
(3)以深度優先方式搜尋解空間,並在搜尋過程中用剪枝函式避免無效搜尋。
4、演算法框架
(1)問題框架
設問題的解是一個n維向量(a1,a2,………,an),約束條件是ai(i=1,2,3,…..,n)之間滿足某種條件,記為f(ai)。
(2)非遞迴回溯框架
int a[n], i;初始化陣列a[]; i = 1; while (i > 0(有路可走) and(未達到目標)) // 還未回溯到頭 { if (i > n) // 搜尋到葉結點 {搜尋到一個解,輸出; } else // 處理第i個元素 { a[i]第一個可能的值; while (a[i]在不滿足約束條件且在搜尋空間內) { a[i]下一個可能的值; } if (a[i]在搜尋空間內) { 19 : 標識佔用的資源;20 : i = i + 1; // 擴充套件下一個結點 21: } 22: else 23: { 清理所佔的狀態空間; // 回溯25: i = i –1; } }
(3)遞迴的演算法框架
回溯法是對解空間的深度優先搜尋,在一般情況下使用遞迴函式來實現回溯法比較簡單,其中i為搜尋的深度,框架如下:
int a[n]; try(int i) { if(i>n) 輸出結果; else { for(j = 下界; j <= 上界; j=j+1) // 列舉i所有可能的路徑 { if(fun(j)) // 滿足限界函式和約束條件 { a[i] = j; ... // 其他操作 try(i+1); 回溯前的清理工作(如a[i]置空值等); } } } }
相關文章
- 五大常用演算法之四:回溯法演算法
- 常用演算法之回溯法演算法
- [演算法之回溯演算法]演算法
- 五大常用演算法之五:分支限界法演算法
- 經典演算法之回溯法演算法
- 演算法-回溯演算法演算法
- 回溯演算法演算法
- 五大常用演算法之一:分治演算法演算法
- 回溯演算法之復原IP地址演算法
- 五大常用演算法總結演算法
- 五大常用演算法之三:貪心演算法演算法
- 【五大常用演算法】一文搞懂分治演算法演算法
- 五大常用演算法:一文搞懂分治演算法演算法
- 五大常用演算法之二:動態規劃演算法演算法動態規劃
- 【基礎演算法】(07)五大常用演算法之三:貪心演算法演算法
- 常用演算法之貪心演算法演算法
- 「演算法之美系列」遞迴與回溯(JS版)演算法遞迴JS
- C++搜尋與回溯演算法之LETTERS(字母)C++演算法
- 【大爽python演算法】遞迴演算法進化之回溯演算法(backtracking)Python演算法遞迴
- php常用的四種排序演算法PHP排序演算法
- 刷題總結——回溯演算法演算法
- 回溯演算法介紹以及模板演算法
- 常用排序演算法之桶排序排序演算法
- 回溯演算法求解橋本分數式演算法
- ”回溯演算法“框架及練習題演算法框架
- Day 22 回溯演算法 part01演算法
- 【演算法框架套路】回溯演算法(暴力窮舉的藝術)演算法框架
- 【LeetCode回溯演算法#08】遞增子序列,鞏固回溯演算法中的去重問題LeetCode演算法
- PHP演算法之四大基礎演算法PHP演算法
- C++搜尋與回溯演算法之Lake Counting(數湖)C++演算法
- 常用排序演算法之JavaScript實現排序演算法JavaScript
- 從八皇后問題到回溯演算法演算法
- 質數填表問題的回溯演算法演算法
- 程式碼隨想錄演算法-回溯4演算法
- 程式碼隨想錄演算法 - 回溯3演算法
- 自動駕駛中常用的四類機器學習演算法自動駕駛機器學習演算法
- 常用演算法演算法
- Day25 第七章 回溯演算法part04 回溯終章演算法