五大经典算法之回溯法
一、基本概念
??回溯法,又稱為試探法,按選優條件向前不斷搜索,以達到目標。但是當探索到某一步時,如果發現原先選擇并不優或達不到目標,就會退回一步重新選擇,這種達不到目的就退回再走的算法稱為回溯法。
與窮舉法的區別和聯系:
相同點:它們都是基于試探的。
區別:窮舉法要將一個解的各個部分全部生成后,才檢查是否滿足條件,若不滿足,則直接放棄該完整解,然后再嘗試另一個可能的完整解,它并沒有沿著一個可能的完整解的各個部分逐步回退生成解的過程。而對于回溯法,一個解的各個部分是逐步生成的,當發現當前生成的某部分不滿足約束條件時,就放棄該步所做的工作,退到上一步進行新的嘗試,而不是放棄整個解重來。
二、基本思想
??對于可以使用回溯法來解決的問題,首先可以將其解空間可以看成一棵解空間樹。在回溯法中,每次擴大當前部分解時,都面臨一個可選的狀態集合(所有的子樹),每個樹結點代表一個可能的部分解。
??回溯法對任一解的生成,一般都采用逐步擴大解的方式。每前進一步,都試圖在當前部分解的基礎上擴大該部分解。它在問題的狀態空間樹中,從開始結點(根結點)出發,以深度優先搜索整個狀態空間。這個開始結點成為活結點,同時也成為當前的擴展結點。在當前擴展結點處,搜索向縱深方向移至一個新結點。這個新結點成為新的活結點,并成為當前擴展結點。如果在當前擴展結點處不能再向縱深方向移動,則當前擴展結點就成為死結點。此時,應往回移動(回溯)至最近的活結點處,并使這個活結點成為當前擴展結點。回溯法以這種工作方式遞歸地在狀態空間中搜索,直到找到所要求的解或解空間中已無活結點時為止。
三、解題步驟(思路)
四、算法框架
1. 遞歸實現:
?變量解釋:
??x:存儲試探解的數組
??n:解空間樹的層數
??i:搜索目前所達到的層數
??start:子節點解空間的最小值
??end:子節點解空間的最大值
?2. 非遞歸實現:
?變量解釋:
??x:存儲試探解的數組
??n:解空間樹的層數
??i:搜索目前所達到的層數
??start:子節點解空間的最小值
??end:子節點解空間的最大值
相比之下,遞歸設計方法比較簡單,而非遞歸方法,也就是循環方法設計細節比較多,但如果掌握了其特點,對不同問題的適用性很強(即代碼只需要很少的修改就可以應用到不同問題),加之其最大的優勢:效率更高(因為遞歸的實現是通過調用函數本身,函數調用的時候,每次調用時要做地址保存,參數傳遞等,這是通過一個遞歸工作棧實現的。具體是每次調用函數本身要保存的內容包括:局部變量、形參、調用函數地址、返回值。那么,如果遞歸調用N次,就要分配N局部變量、N形參、N調用函數地址、N返回值。這勢必是影響效率的。)
五、經典實現
經典問題:八皇后問題
??八皇后問題,是一個古老而著名的問題,是回溯算法的典型例題。該問題是十九世紀著名的數學家高斯1850年提出:
??在8X8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處于同一行、同一列或同一斜線上(斜率為1),問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜志上不同的作者發表了40種不同的解,后來有人用圖論的方法解出92種結果。
遞歸實現為以下代碼中backtrack方法
非遞歸實現為以下代碼中f_backtrack方法:
轉載于:https://www.cnblogs.com/codernie/p/9070015.html
總結
以上是生活随笔為你收集整理的五大经典算法之回溯法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python脚本 监控MySQL sla
- 下一篇: 显示point data的时均值注意事项