演算法學習 看看深度優先搜尋演算法

2021-07-09 05:45:31 字數 1149 閱讀 8349

先看一題:給定整數a1,a2,a3…an,判斷是否可以從中選出若干數,使他們的和恰好為k。

那麼,現在分析一下問題的需求。只需從a1開始按順序決定每個數加或者不加,在管不n個數都決定後在判斷他們的和是否為k即可。換乙個方式想,從某個狀態開始不斷的轉移狀態直到無法轉移,然後然後回退到前一步的狀態,繼續轉移到其他狀態,如此不斷的重複。

如何實現這種搜尋,很容易想到一種搜尋手段–深度優先搜尋。

深度優先搜尋演算法(英語:depth-first-search,簡稱dfs)是一種用於遍歷或搜尋樹或圖的演算法。沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中乙個作為源節點並重複以上過程,整個程序反覆進行直到所有節點都被訪問為止。屬於盲目搜尋。

順便提一句,因發明「深度優先搜尋演算法」,約翰·霍普克洛夫特與羅伯特·塔揚共同獲得計算機領域的最高獎:圖靈獎。

下面回到開始的問題。根據深度優先搜尋演算法的特點–不斷轉移狀態和重複,通常情況下採用遞迴函式實現會比較簡單。我們可以把陣列和狀態的轉移看成二叉樹,假設輸入的資料是a=,k=15,根據上面的分析我們應該可以畫出下面的圖:

既然思路分析清晰了,**自然水到渠成。下面只是我的一種實現方式。

/**

**@param a 初始輸入陣列

*@param i 第i項

*@param sum 遍歷到i項時的和

*@param k 目標結果

*@return

*/private

static

boolean

defmethod(int a, int i, int sum, int k)

思路和**都完成,剩下的就是分析下以上演算法的複雜度了。

因為狀態數是2n

+1所以,複雜度就可以得知是o(

2n)

最後,一句話總結下:深度優先搜尋就是從最開始的狀態出發,遍歷所有可以達到的狀態。由此就可以對所有的狀態進行操作或者列出所有的狀態的了。

深度優先搜尋演算法

include include define vertexnum 9 struct node typedef struct node graph struct node head vertexnum 定義圖形結構 int visited vertexnum 頂點陣列 深度優先搜尋 void dfs ...

深度優先搜尋演算法

今天我們來複習一下萬能的搜尋演算法之深度優先搜尋演算法。深度優先搜尋演算法顧名思義就是按照樹的延伸不停的往下搜尋,直到樹的盡頭之後再一步一步的回溯回來。好吧,我們直接問你乙個問題,給你乙個數n,讓你輸出從1到這個樹的全排列,你會怎麼寫,會不會想到去用若干個for迴圈?好吧,你肯定錯了,其實他考的就是...

深度優先搜尋演算法

1.深度優先搜尋演算法的概念 深度優先搜尋屬於圖演算法的一種,英文縮寫為dfs depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個 節點只能訪問一次。如下例 該圖為乙個無向圖,假設我們從a開始進行深度優先搜尋,第二點可以是b c d中任意乙個,...