昊昊帶你學 深搜 DFS

2021-06-13 17:19:00 字數 1304 閱讀 4541

什麼是搜尋

首先,學習搜尋,我們必須要知道我們要搜尋的是什麼。抽象的來講,是某一種狀態。而且是通過各個狀態之間的轉移來實現搜尋的。比如說我們走迷宮。你通過某種路徑走到迷宮中某個位置就可以看做乙個狀態。你想找出走出迷宮的一條路,就可以看做,從入口那一點開始,一步一步轉移,直到你出現在出口位置為止。

回溯演算法

「用回溯演算法解決問題的一般步驟:

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步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優解,必需記實並完成全數搜尋,故一般情況下,深搜需要很是高效的剪枝 優化 像搜尋最短路徑這些的很顯著是用廣...