經典算法之回溯算法

算法之回溯框架

定義

​ 回溯算法實際上一個相似枚舉的搜索嘗試過程,主要是在搜索嘗試過程當中尋找問題的解,當發現已不知足求解條件時,就「回溯」返回,嘗試別的路徑。回溯算法說白了就是窮舉法。不過回溯算法使用剪枝函數,剪去一些不可能到達 最終狀態(即答案狀態)的節點,從而減小狀態空間樹節點的生成。回溯法是一個既帶有系統性又帶有跳躍性的的搜索算法。它在包含問題的全部解的解空間樹中,按照深度優先的策略,從根結點出發搜索解空間樹。算法搜索至解空間樹的任一結點時,老是先判斷該結點是否確定不包含問題的解。python

基本框架

​ 幾個概念要弄清楚:路徑 選擇列表 結束條件算法

其基本框架:框架

result = []
def backtrack(路徑, 選擇列表):
    if 知足結束條件:
        result.add(路徑)
        return

    for 選擇 in 選擇列表:
        作選擇
        backtrack(路徑, 選擇列表)
        撤銷選擇

解釋:首先在函數開始要寫好結束條件,否則遞歸調用會無線遞歸下去。函數

​ 爲何要寫for循環,通常來講相似多叉樹就用for循環,二叉樹能夠用兩個並列的遞歸。指的是有不少個剩下的選擇(其實就是選擇列表)。而後作出一個選擇以後,就是在當前節點選擇其任意一個子節點。而後遞歸調用能夠當作是把選擇的該子節點當成當前節點。code

​ 爲何要撤銷選擇,由於當backtrace遍歷到結束條件的那一層時,要返回上一層,進行另一個子節點的選擇時,要撤銷上次作的選擇,恢復到原來的選擇列表。遞歸

例子

​ 值得看的幾個例子是全排列N皇后數獨leetcode

全排列get

image-20200411174958375

N皇后博客

image-20200411175047896

解數獨it

image-20200411174912499

回溯算法leetcode專題

其中我主要是看了另一篇博客,我以爲講的很是棒。地址

相關文章
相關標籤/搜索