亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

js數(shù)據(jù)結(jié)構(gòu)和算法(四)圖和圖算法

Doyle / 2054人閱讀

摘要:分別被命名為和。圖的遍歷深度優(yōu)先遍歷深度優(yōu)先遍歷,也有稱為深度優(yōu)先搜索,簡稱為。拓撲排序算法與類似,不同的是,拓撲排序算法不會立即輸出已訪問的頂點,而是訪問當(dāng)前頂點鄰接表中的所有相鄰頂點,直到這個列表窮盡時,才會將當(dāng)前頂點壓入棧中。

圖的定義

圖(Graph)是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為:G(V,E),其中,G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合。

有向圖


有向邊:若從頂點ViVj的邊有方向,則稱這條邊為有向邊,也成為弧(Arc),用有序偶來表示,Vi稱為弧尾,Vj稱為弧頭。

無序圖

**
無向邊:**若頂點ViVj之間的邊沒有方向,則稱這條邊為無向邊(Edge),用無序偶(Vi,Vj)來表示。

簡單圖

簡單圖:在圖結(jié)構(gòu)中,若不存在頂點到其自身的邊,且同一條邊不重復(fù)出現(xiàn),則稱這樣的圖為簡單圖。

圖類 表示頂點

創(chuàng)建圖類的第一步就是要創(chuàng)建一個Vertex類來保存頂點和邊。這個類的作用和鏈表、二叉搜索樹的Node類一樣。Vertex類有兩個數(shù)據(jù)成員:一個用于標(biāo)識頂點,另一個表明是否被訪問過的布爾值。分別被命名為labelwasVisited。

function Vertex(label){
    this.label = label;
}

我們將所有頂點保存在數(shù)組中,在圖類里,可以通過他們在數(shù)組中的位置引用他們

表示邊

圖的實際信息都保存在“邊”上面,因為他們描述了圖的結(jié)構(gòu)。二叉樹的一個父節(jié)點只能有兩個子節(jié)點,而圖的結(jié)構(gòu)卻要靈活得多,一個頂點既可以有一條邊,也可以有多條邊和它相連。

我們將表示圖的邊的方法成為鄰接表或者鄰接表數(shù)組。它將存儲由頂點的相鄰頂點列表構(gòu)成的數(shù)組

構(gòu)建圖

定義如下一個Graph類:

function Graph(v){
    this.vertices = v;//vertices至高點
    this.edges = 0;
    this.adj = [];
    for(var i =0;I

這個類會記錄一個圖表示了多少條邊,并使用一個長度與圖的頂點數(shù)來記錄頂點的數(shù)量。

function addEdge(){
    this.adj[v].push(w);
    this.adj[w].push(v);
    this.edges++;
}

這里我們使用for循環(huán)為數(shù)組中的每個元素添加一個子數(shù)組來存儲所有的相鄰頂點,并將所有元素初始化為空字符串。

圖的遍歷 深度優(yōu)先遍歷

深度優(yōu)先遍歷(DepthFirstSearch),也有稱為深度優(yōu)先搜索,簡稱為DFS。

比如在一個房間內(nèi)尋找一把鑰匙,無論從哪一間房間開始都可以,將房間內(nèi)的墻角、床頭柜、床上、床下、衣柜、電視柜等挨個尋找,做到不放過任何一個死角,當(dāng)所有的抽屜、儲藏柜中全部都找遍后,接著再尋找下一個房間。

深度優(yōu)先搜索:

深度優(yōu)先搜索就是訪問一個沒有訪問過的頂點,將他標(biāo)記為已訪問,再遞歸地去訪問在初始頂點的鄰接表中其他沒有訪問過的頂點

為Graph類添加一個數(shù)組:

this.marked = [];//保存已訪問過的頂點
for(var i=0;i

深度優(yōu)先搜索函數(shù):

function dfs(v){
    this.marked[v] = true;
    //if語句在這里不是必須的
    if(this.adj[v] != undefined){
        print("Visited vertex: " + v );
        for each(var w in this.adj[v]){
            if(!this.marked[w]){
                this.dfs(w);
            }
        }
    }
}
廣度優(yōu)先搜索

廣度優(yōu)先搜索(BFS)屬于一種盲目搜尋法,目的是系統(tǒng)地展開并檢查圖中的所有節(jié)點,以找尋結(jié)果。換句話說,它并不考慮結(jié)果的可能位置,徹底地搜索整張圖,直到找到結(jié)果為止。

廣度優(yōu)先搜索從第一個頂點開始,嘗試訪問盡可能靠近它的頂點,如下圖所示:

其工作原理為:

 1. 首先查找與當(dāng)前頂點相鄰的未訪問的頂點,將其添加到已訪問頂點列表及隊列中;
 2. 然后從圖中取出下一個頂點v,添加到已訪問的頂點列表
 3. 最后將所有與v相鄰的未訪問頂點添加到隊列中

下面是廣度優(yōu)先搜索函數(shù)的定義:

function bfs(s){
    var queue = [];
    this.marked = true;
    queue.push(s);//添加到隊尾
    while(queue.length>0){
        var v = queue.shift();//從隊首移除
        if(v == undefined){
            print("Visited vertex: " + v);
        }
        for each(var w in this.adj[v]){
            if(!this.marked[w]){
                this.edgeTo[w] = v;
                this.marked[w] = true;
                queue.push(w);
            }
        }
    }
}

最短路徑

在執(zhí)行廣度優(yōu)先搜索時,會自動查找從一個頂點到另一個相連頂點的最短路徑

確定路徑

要查找最短路徑,需要修改廣度優(yōu)先搜索算法來記錄從一個頂點到另一個頂點的路徑,我們需要一個數(shù)組來保存從一個頂點操下一個頂點的所有邊,我們將這個數(shù)組命名為edgeTo

this.edgeTo = [];//將這行添加到Graph類中

//bfs函數(shù)
function bfs(s){
    var queue = [];
    this.marked = true;
    queue.push(s);//添加到隊尾
    while(queue.length>0){
        var v = queue.shift();//從隊首移除
        if(v == undefined){
            print("Visited vertex: " + v);
        }
        for each(var w in this.adj[v]){
            if(!this.marked[w]){
                this.edgeTo[w] = v;
                this.marked[w] = true;
                queue.push(w);
            }
        }
    }
}
拓撲排序算法

拓撲排序會對有向圖的所有頂點進行排序,使有向邊從前面的頂點指向后面的頂點。
拓撲排序算法與BFS類似,不同的是,拓撲排序算法不會立即輸出已訪問的頂點,而是訪問當(dāng)前頂點鄰接表中的所有相鄰頂點,直到這個列表窮盡時,才會將當(dāng)前頂點壓入棧中。

拓撲排序算法被拆分為兩個函數(shù),第一個函數(shù)是topSort(),用來設(shè)置排序進程并調(diào)用一個輔助函數(shù)topSortHelper(),然后顯示排序好的頂點列表

拓撲排序算法主要工作是在遞歸函數(shù)topSortHelper()中完成的,這個函數(shù)會將當(dāng)前頂點標(biāo)記為已訪問,然后遞歸訪問當(dāng)前頂點鄰接表中的每個頂點,標(biāo)記這些頂點為已訪問。最后,將當(dāng)前頂點壓入棧中。

//topSort()函數(shù)
function topSort(){
    var stack = [];
    var visited = [];
    for(var i =0;i           
               
                                           
                       
                 

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/85425.html

相關(guān)文章

  • 算法-圖算法

    摘要:圖的定義用圖對現(xiàn)實中的系統(tǒng)建模可以用圖對現(xiàn)實中的很多系統(tǒng)建模比如對交通流量建模頂點可以表示街道的十字路口邊可以表示街道加權(quán)的邊可以表示限速或者車道的數(shù)量建模人員可以用這個系統(tǒng)來判斷最佳路線及最有可能堵車的街道任何運輸系統(tǒng)都可以用圖來建模比如 圖的定義 用圖對現(xiàn)實中的系統(tǒng)建模 可以用圖對現(xiàn)實中的很多系統(tǒng)建模. 比如對交通流量建模, 頂點可以表示街道的十字路口, 邊可以表示街道. 加權(quán)的邊...

    Anshiii 評論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)算法:二分查找

    摘要:為檢查長度為的列表,二分查找需要執(zhí)行次操作。最后需要指出的一點是高水平的讀者可研究一下二叉樹關(guān)于二叉樹,戳這里數(shù)據(jù)結(jié)構(gòu)與算法二叉樹算法常見練習(xí)在一個二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。 常見數(shù)據(jù)結(jié)構(gòu) 簡單數(shù)據(jù)結(jié)構(gòu)(必須理解和掌握) 有序數(shù)據(jù)結(jié)構(gòu):棧、隊列、鏈表。有序數(shù)據(jù)結(jié)構(gòu)省空間(儲存空間?。?無序數(shù)據(jù)結(jié)構(gòu):集合、字典、散列表,無序...

    zsirfs 評論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)算法:二分查找

    摘要:為檢查長度為的列表,二分查找需要執(zhí)行次操作。最后需要指出的一點是高水平的讀者可研究一下二叉樹關(guān)于二叉樹,戳這里數(shù)據(jù)結(jié)構(gòu)與算法二叉樹算法常見練習(xí)在一個二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。 常見數(shù)據(jù)結(jié)構(gòu) 簡單數(shù)據(jù)結(jié)構(gòu)(必須理解和掌握) 有序數(shù)據(jù)結(jié)構(gòu):棧、隊列、鏈表。有序數(shù)據(jù)結(jié)構(gòu)省空間(儲存空間?。?無序數(shù)據(jù)結(jié)構(gòu):集合、字典、散列表,無序...

    you_De 評論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)算法:二分查找

    摘要:為檢查長度為的列表,二分查找需要執(zhí)行次操作。最后需要指出的一點是高水平的讀者可研究一下二叉樹關(guān)于二叉樹,戳這里數(shù)據(jù)結(jié)構(gòu)與算法二叉樹算法常見練習(xí)在一個二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。 常見數(shù)據(jù)結(jié)構(gòu) 簡單數(shù)據(jù)結(jié)構(gòu)(必須理解和掌握) 有序數(shù)據(jù)結(jié)構(gòu):棧、隊列、鏈表。有序數(shù)據(jù)結(jié)構(gòu)省空間(儲存空間?。?無序數(shù)據(jù)結(jié)構(gòu):集合、字典、散列表,無序...

    gotham 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<