回溯法遵循深度優先嗎 深度優先搜尋(回溯法)

2021-10-17 01:55:57 字數 2175 閱讀 8610

事實上,深度優先搜尋屬於圖演算法的一種,英文縮寫為dfs即depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次.

舉例說明之:下圖是乙個無向圖,如果我們從a點發起深度優先搜尋(以下的訪問次序並不是唯一的,第二個點既可以是b也可以是c,d),則我們可能得到如下的乙個訪問過程:a->b->e(沒有路了!回溯到a)->c->f->h->g->d(沒有路,最終回溯到a,a也沒有未訪問的相鄰節點,本次搜尋結束).

圖簡要說明深度優先搜尋的特點:每次深度優先搜尋的結果必然是圖的乙個連通分量.深度優先搜尋可以從多點發起.如果將每個節點在深度優先搜尋過程中的"結束時間"排序(具體做法是建立乙個list,然後在每個節點的相鄰節點都已被訪問的情況下,將該節點加入list結尾,然後逆轉整個鍊錶),則我們可以得到所謂的"拓撲排序",即topological sort.

基本思路

深度優先遍歷圖的方法是,從圖中某頂點v出發:

(1)訪問頂點v;

(2)依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍歷;直至圖中和v有路徑相通的頂點都被訪問;

(3)若此時圖中尚有頂點未被訪問,則從乙個未被訪問的頂點出發,重新進行深度優先遍歷,直到圖中所有頂點均被訪問過為止。 當然,當人們剛剛掌握深度優先搜尋的時候常常用它來走迷宮.事實上我們還有別的方法,那就是廣度優先搜尋(bfs).狀態(state):狀態是制問題求解過程中每一步的狀況。

算符(operater)算符是把問題從一種狀態變換到另一種狀態的方法代號。算符的取值範圍就是搜尋的範圍。(一般設為區域性變數)。

窮舉在我們遇到的一些問題當中,有些問題我們不能夠確切的找出數學模型,即找不出一種直接求解的方法,解決這一類問題,我們一般採用搜尋的方法解決。搜尋就是用問題的所有可能去試探,按照一定的順序、規則,不斷去試探,直到找到問題的解,試完了也沒有找到解,那就是無解,試探時一定要試探完所有的情況(實際上就是窮舉);

對於問題的第乙個狀態,叫初始狀態,要求的狀態叫目標狀態。

搜尋就是把規則應用於實始狀態,在其產生的狀態中,直到得到乙個目標狀態為止。

產生新的狀態的過程叫擴充套件(由乙個狀態,應用規則,產生新狀態的過程)

搜尋的要點:(1)初始狀態;

(2)重複產生新狀態;

(3)檢查新狀態是否為目標,是結束,否轉(2);

如果搜尋是以接近起始狀態的程式依次擴充套件狀態的,叫寬度優先搜尋。

如果擴充套件是首先擴充套件新產生的狀態,則叫深度優先搜尋。

深度優先搜尋

深度優先搜尋用乙個陣列存放產生的所有狀態。

(1) 把初始狀態放入陣列中,設為當前狀態;

(2) 擴充套件當前的狀態,產生乙個新的狀態放入陣列中,同時把新產生的狀態設為當前狀態;

(3) 判斷當前狀態是否和前面的重複,如果重複則回到上乙個狀態,產生它的另一狀態;

(4) 判斷當前狀態是否為目標狀態,如果是目標,則找到乙個解答,結束演算法。

(5) 如果陣列為空,說明無解。

對於pascal語言來講,它支援遞迴,在遞迴時可以自動實現回溯(利用區域性變數)所以使用遞迴編寫深度優先搜尋程式相對簡單,當然也有非遞迴實現的演算法。

搜尋是人工智慧中的一種基本方法,是一項非常普遍使用的演算法策略,能夠解決許許多多的常見問題,在某些情況下我們很難想到高效的解法時,搜尋往往是可選的唯一選擇。按照標準的話來講:搜尋演算法是利用計算機的高效能來有目的的窮舉乙個問題的部分或所有的可能情況,從而求出問題的解的一種方法。

搜尋雖然簡單易學易於理解,但要掌握好並寫出速度快效率高優化好的程式卻又相當困難,總而言之,搜尋演算法靈活多變,一般的框架很容易寫出,但合適的優化卻要根據實際情況來確定。在搜尋演算法中,深度優先搜尋(也可以稱為回溯法)是搜尋演算法裡最簡單也最常見的,今天我們就從這裡講起,下面的內容假設讀者已經知道最基本的程式設計和簡單的遞迴演算法。

產生式系統和搜尋樹

所有的搜尋演算法從其最終的演算法實現上來看,都可以劃分成兩個部分──控制結構和產生系統。正如前面所說的,搜尋演算法簡而言之就是窮舉所有可能情況並找到合適的答案,所以最基本的問題就是羅列出所有可能的情況,這其實就是一種產生式系統。

我們將所要解答的問題劃分成若干個階段或者步驟,當乙個階段計算完畢,下面往往有多種可選選擇,所有的選擇共同組成了問題的解空間,對搜尋演算法而言,將所有的階段或步驟畫出來就類似是樹的結構(如圖)。

從根開始計算,到找到位於某個節點的解,回溯法(深度優先搜尋)作為最基本的搜尋演算法,其採用了一種「乙隻向下走,走不通就掉頭」的思想(體會「回溯」二字),相當於採用了先根遍歷的方法來構造搜尋樹。

回溯法遵循深度優先嗎 閒來刷下 回溯演算法

回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,...

深度優先遍歷 遞迴 深度優先搜尋和廣度優先搜尋

對於搜尋來說,我們絕大多數情況下處理的都是叫 所謂的暴力搜尋 或者是說比較簡單樸素的搜尋,也就是說你在搜尋的時候沒有任何所謂的智慧型的情況在裡面考慮,很多情況下它做的一件事情就是把所有的結點全部遍歷一次,然後找到你要的結果。基於這樣的乙個資料結構,如果這個資料結構本身是沒有任何特點的,也就是說是乙個...

回溯和深度優先遍歷

回溯演算法思想如果在遞迴中使用其實就是深度優先遍歷。這是因為在遞迴呼叫中隱含著狀態的自動回退和恢復。就比如最經典的八皇后問題,說是用回溯演算法解決,但是實質上還是使用的深度優先遍歷。所以如果想學懂,第一步應該懂的是如何用遞迴解決問題。我們知道遞迴必須具備兩個條件,乙個是呼叫自己,乙個是有終止條件。這...