什麼是搜尋
首先,學習搜尋,我們必須要知道我們要搜尋的是什麼。抽象的來講,是某一種狀態。而且是通過各個狀態之間的轉移來實現搜尋的。比如說我們走迷宮。你通過某種路徑走到迷宮中某個位置就可以看做乙個狀態。你想找出走出迷宮的一條路,就可以看做,從入口那一點開始,一步一步轉移,直到你出現在出口位置為止。
回溯演算法
「用回溯演算法解決問題的一般步驟:
1 針對所給問題,定義問題的解空間,它至少包含問題的乙個(最優)解。
2 確定易於搜尋的解空間結構,使得能用回溯法方便地搜尋整個解空間 。
3 以深度優先的方式搜尋解空間,並且在搜尋過程中用剪枝函式避免無效搜尋。
問題的解空間通常是在搜尋問題解的過程中動態產生的,這是回溯演算法的乙個重要
特性。」
「高深」的東東我們都得使它通俗易懂是吧。我們來舉個栗子:從左上角開始遍歷九宮格,每次只能走一格(上下左右),且走過的不能再走,不能出九宮格。(剛寫完程式回來,艾瑪,為了形象一點展示回溯過程,小細節各種多。)輸出總共有多少種走法。我寫完結果是8種,主頁裡有專門一篇日誌裡放了九宮格遍歷的全部狀態圖。形象得向大家展示了狀態直接是如何轉換的。大家一定要仔細看一看。我下面貼出回溯的那段**:
//迷宮問題經常出現的陣列 xx和yy 大家思考一下這是什麼作用,
//不懂**問:80103249
int xx[5] = ;
int yy[5] = ;
//下面是dfs()函式中回溯的部分
for (int i=1; i<=4; i++)
}for迴圈就是來採取4種決策——上下左右。當採取某一種決策時,我們就將相應的格仔置零,呼叫dfs()繼續從那個格仔開始搜。但是當dfs()結束之後,我們要接著進行下乙個決策,這個時候,我們要將現場恢復原狀,即讓九宮格看上去好像沒有做上一次決策。方法就是將剛剛置零的那個點,再置回1。因為存在回溯,所以dfs()退出之後,是不改變九宮格面貌的。回溯理解起來可能會有一些困難,不過還是老話,你一旦理解了,就發現都是順其自然的事兒嘛!
深搜最後我們來好好說說深搜。深搜dfs,深度優先搜尋(deep first search)。我們前面說過,搜尋就是在各種狀態中搜尋。這些狀態可以形成一棵狀態樹。有第乙個狀態,通過某些決策,可以生成若干狀態,這些狀態可以看做先前狀態的孩子節點。深搜的時候,一次只需要儲存乙個狀態就可以。相比較寬搜來看,記憶體開銷要小一些,而且程式設計實現相對容易。不知道還有沒有其他什麼優點。
深搜暫且給大家講到這裡,這次內容不多,其實也是因為搜尋的確不好講。主要部分就是舉的那個栗子~最重要的還是大家自己多練練,多思考思考,另外多跟別人交流。
ps:九宮格遍歷的那個程式(.cpp),如果感興趣可以加qq群:80103249,裡面已經共享。
昊昊帶你學 演算法概述
什麼是演算法 雖然這篇題目叫概述,不過本菜只是不知道該叫什麼好,我這種小白腫麼敢概述演算法是不。就是總體上說說我對演算法的理解吧 o o 演算法可能有些初學童鞋接觸過。有些地方高中教材裡會涉及到 江蘇是有的 演算法導論 給出了乙個定義 所謂演算法就是定義良好的計算過程,它取乙個或一組值作為輸入,並產...
dfs 深搜 模板
關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用的搜尋分支。有可行性剪枝和最優性剪枝兩種。int mx 4 向上下左右四個方向移動 0,1 0,1 1,0 1,0 int my 4 bool check int x,int y 判斷是否滿足條件的子...
深搜DFS和廣搜BFS
一般來說,廣搜常用於找單一的最短路線,或者是規模小的路徑搜尋,它的特點是 搜到就是最優解 而深搜用於找多個解或者是 步數已知 好比3步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優解,必需記實並完成全數搜尋,故一般情況下,深搜需要很是高效的剪枝 優化 像搜尋最短路徑這些的很顯著是用廣...