深度優(yōu)先搜索(DFS)思路及算法分析

學(xué)號(hào):20011210126
姓名:劉巖哲
轉(zhuǎn)載自:https://www.cnblogs.com/Unicron/p/10849942.html

【嵌牛導(dǎo)讀】

深度優(yōu)先搜索(縮寫DFS)有點(diǎn)類似廣度優(yōu)先搜索锦秒,也是對(duì)一個(gè)連通圖進(jìn)行遍歷的算法平道。它的思想是從一個(gè)頂點(diǎn)V0開(kāi)始,沿著一條路一直走到底阶祭,如果發(fā)現(xiàn)不能到達(dá)目標(biāo)解犀农,那就返回到上一個(gè)節(jié)點(diǎn)寒锚,然后從另一條路開(kāi)始走到底宠哄,這種盡量往深處走的概念即是深度優(yōu)先的概念。

【嵌牛鼻子】深度優(yōu)先搜索(DFS)思路及算法分析

【嵌牛正文】

1禽最、算法用途

用于遍歷圖中的節(jié)點(diǎn)腺怯,有些類似于樹的深度優(yōu)先遍歷。這里唯一的問(wèn)題是川无,與樹不同呛占,圖形可能包含循環(huán),因此我們可能會(huì)再次來(lái)到同一節(jié)點(diǎn)懦趋。

2晾虑、主要思想

借用一個(gè)鄰接表和布爾類型數(shù)組(判斷一個(gè)點(diǎn)是否查看過(guò),用于避免重復(fù)到達(dá)同一個(gè)點(diǎn)愕够,造成死循環(huán)等)走贪,先將所有點(diǎn)按一定次序存入鄰接表,再通過(guò)迭代器惑芭,對(duì)鄰接表的linklist和布爾數(shù)組做出操作坠狡,從而達(dá)到不重復(fù)遞歸遍歷的效果。


圖一

(鄰接表是表示了圖中與每一個(gè)頂點(diǎn)相鄰的邊集的集合遂跟,這里的集合指的是無(wú)序集)

3逃沿、代碼(java)

圖二

(以上圖為例的代碼)

 //深度優(yōu)先搜索
import java.io.*;
import java.util.*;

//This class represents a directed graph using adjacency list
//representation
class Graph
{
    private int V; // No. of vertices

    // Array of lists for Adjacency List Representation
    private LinkedList<Integer> adj[];

    // Constructor
    Graph(int v)
    {
        V = v;
        adj = new LinkedList[v];
        for (int i=0; i<v; ++i)
            adj[i] = new LinkedList();
    }

    //Function to add an edge into the graph
    void addEdge(int v, int w)
    {
        adj[v].add(w); // Add w to v's list.
    }

    // A function used by DFS
    void DFSUtil(int v,boolean visited[])
    {
        // Mark the current node as visited and print it
        visited[v] = true;
        System.out.print(v+" ");

        // Recur for all the vertices adjacent to this vertex
        Iterator<Integer> i = adj[v].listIterator();
        while (i.hasNext())
        {
            int n = i.next();
            if (!visited[n])
                DFSUtil(n,visited);
        }
    }

    // The function to do DFS traversal. It uses recursive DFSUtil()
    void DFS()
    {
        // Mark all the vertices as not visited(set as
        // false by default in java)
        boolean visited[] = new boolean[V];

        // Call the recursive helper function to print DFS traversal
        // starting from all vertices one by one
        for (int i=0; i<V; ++i)
            if (visited[i] == false)
                DFSUtil(i, visited);
    }

    public static void main(String args[])
    {
        Graph g = new Graph(4);

        g.addEdge(0, 1);
        g.addEdge(0, 2);
        g.addEdge(1, 2);
        g.addEdge(2, 0);
        g.addEdge(2, 3);
        g.addEdge(3, 3);

        System.out.println("Following is Depth First Traversal");

        g.DFS();
    }
}

4婴渡、復(fù)雜度分析

DFS復(fù)雜度分析 DFS算法是一一個(gè)遞歸算法,需要借助一個(gè)遞歸工作棧凯亮,故它的空問(wèn)復(fù)雜度為O(V)边臼。 遍歷圖的過(guò)程實(shí)質(zhì)上是對(duì)每個(gè)頂點(diǎn)查找其鄰接點(diǎn)的過(guò)程,其耗費(fèi)的時(shí)間取決于所采用結(jié)構(gòu)假消。 鄰接表表示時(shí)柠并,查找所有頂點(diǎn)的鄰接點(diǎn)所需時(shí)間為O(E),訪問(wèn)頂點(diǎn)的鄰接點(diǎn)所花時(shí)間為O(V),此時(shí)富拗,總的時(shí)間復(fù)雜度為O(V+E)臼予。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市啃沪,隨后出現(xiàn)的幾起案子粘拾,更是在濱河造成了極大的恐慌,老刑警劉巖创千,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缰雇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡追驴,警方通過(guò)查閱死者的電腦和手機(jī)械哟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)氯檐,“玉大人戒良,你說(shuō)我怎么就攤上這事体捏」谏悖” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵几缭,是天一觀的道長(zhǎng)河泳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)年栓,這世上最難降的妖魔是什么拆挥? 我笑而不...
    開(kāi)封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舷暮。我一直安慰自己扒披,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布受裹。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洲拇。 梳的紋絲不亂的頭發(fā)上奈揍,一...
    開(kāi)封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音赋续,去河邊找鬼男翰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纽乱,可吹牛的內(nèi)容都是我干的蛾绎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鸦列,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秘通!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起敛熬,我...
    開(kāi)封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤肺稀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后应民,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體话原,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年诲锹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了繁仁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡归园,死狀恐怖黄虱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庸诱,我是刑警寧澤捻浦,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站桥爽,受9級(jí)特大地震影響朱灿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钠四,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一盗扒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缀去,春花似錦侣灶、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至阎曹,卻和暖如春伪阶,著一層夾襖步出監(jiān)牢的瞬間煞檩,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工栅贴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斟湃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓檐薯,卻偏偏與公主長(zhǎng)得像凝赛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坛缕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348