回溯法應該知道的知識點

回溯法也能夠叫作回溯搜索法,是一種搜索的方式,回溯和遞歸是相輔相成的,回溯是遞歸的副產品,只要有遞歸就會有回溯,因此能夠簡單的理解回溯函數和遞歸函數是同一個函數。算法

大名鼎鼎的回溯法雖然很很差理解,但其本質就是暴力查找,窮舉全部可能,而後找出咱們想要的答案,並非什麼高效的算法,雖然有些能夠剪枝一下,沒有更優化的方法了,至於爲何不高效還要用,那沒別的更好的了能解決問題就不錯了還想咋滴。函數

回溯法能夠解決組合、排列、切割、子集、棋盤(N皇后,解數獨)等問題,其中組合無序,排列有序。以上這幾類問題都不簡單。優化

回溯法解決的全部問題其實均可以抽象爲樹形結構,由於它解決的都是在結合中查找子集,集合的大小就構成了樹的寬度,遞歸的深度構成樹的深度(遞歸就要有終止條件,必然是一個棵高度有限的N叉樹)。spa

和遞歸函數同樣,三部曲:(1)肯定回溯函數返回值和參數(通常不須要返回值,參數其實也很差肯定,能夠先寫邏輯,再定參數)(2)終止條件(3)回溯搜索的遍歷過程邏輯。code

回溯法的問題有一個套用的模板幫助解決問題:blog

void backtracking(參數) {
    if (終止條件) {
        存放結果;
        return;
    }

    for (選擇:本層集合中元素(樹中節點孩子的數量就是集合的大小)) {
        處理節點;
        backtracking(路徑,選擇列表); // 遞歸
        回溯,撤銷處理結果
    }
}

終止條件說的就是一旦知足了要求的條件(通常來講搜索到葉子結點),就是找到了知足條件的一條答案,把這個答案存放起來,並接受這層遞歸。for循環是樹的橫向遍歷,而遞歸調用時樹的深度遍歷,這樣就能把一棵樹都遍歷到了。遞歸

相關文章
相關標籤/搜索