首頁 web前端 js教程 JavaScript資料結構與演算法之圖與圖演算法_基礎知識

JavaScript資料結構與演算法之圖與圖演算法_基礎知識

May 16, 2016 pm 04:14 PM
javascript 圖形演算法 資料結構 演算法

圖的定義

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

有向圖

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

無序圖

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

簡單圖

簡單圖:在圖結構中,若不存在頂點到其自身的邊,且同一條邊不重複出現,則稱這樣的圖為簡單圖。

圖類

表示頂點

建立圖類的第一步就是要建立一個Vertex類別來保存頂點和邊。這個類別的作用和鍊錶、二元搜尋樹的Node類別一樣。 Vertex類別有兩個資料成員:一個用來識別頂點,另一個表示是否被存取過的布林值。分別被命名為label和wasVisited。

複製程式碼 程式碼如下:

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

我們將所有頂點保存在數組中,在圖類裡,可以透過他們在數組中的位置引用他們

表示邊

圖的實際資訊都保存在「邊」上面,因為他們描述了圖的結構。二元樹的一個父節點只能有兩個子節點,而圖的結構卻要靈活得多,一個頂點既可以有一條邊,也可以有多條邊和它相連。

我們將表示圖的邊的方法成為鄰接表或鄰接表數組。它將儲存由頂點的相鄰頂點列表構成的數組

建構圖

定義如下一個Graph類:

複製程式碼 程式碼如下:

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

這個類別會記錄一個圖表示了多少邊,並使用一個長度與圖的頂點數來記錄頂點的數量。
複製程式碼 程式碼如下:

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

這裡我們使用for迴圈為陣列中的每個元素新增一個子陣列來儲存所有的相鄰頂點,並將所有元素初始化為空字串。

圖的遍歷

深度優先遍歷

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

例如在一個房間內尋找一把鑰匙,無論從哪一間房間開始都可以,將房間內的牆角、床頭櫃、床上、床下、衣櫃、電視櫃等挨個尋找,做到不放過任何一個死角,當所有的抽屜、儲藏櫃中全部都找遍後,接著再尋找下一個房間。

深度優先搜尋:

深度優先搜尋就是訪問一個沒有訪問過的頂點,將他標記為已訪問,再遞歸地去訪問在初始頂點的鄰接表中其他沒有訪問過的頂點

為Graph類別新增一個陣列:

複製程式碼 程式碼如下:

this.marked = [];//儲存已造訪過的頂點
for(var i=0;i     this.marked[i] = false;//初始化為false
}

深度優先搜尋函數:

複製程式碼 程式碼如下:

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);
            }
        }
    }
}

廣度優先搜尋

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

廣度優先搜尋從第一個頂點開始,盡量存取盡可能靠近它的頂點,如下圖所示:

其工作原理為:

 1. 首先尋找與目前頂點相鄰的未存取的頂點,將其新增至已存取頂點清單及佇列;
 2. 然後從圖中取出下一個頂點v,加入到已訪問的頂點列表
 3. 最後將所有與v相鄰的未存取頂點加入佇列
以下是廣度優先搜尋函數的定義:

複製程式碼 程式碼如下:

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);
            }
        }
    }
}

最短路徑

執行廣度優先搜尋時,會自動尋找從一個頂點到另一個相連頂點的最短路徑

確定路徑

要找出最短路徑,需要修改廣度優先搜尋演算法來記錄從一個頂點到另一個頂點的路徑,我們需要一個陣列來保存從一個頂點操下一個頂點的所有邊,我們將這個陣列命名為edgeTo

複製程式碼 程式碼如下:

this.edgeTo = [];//將這行加入Graph類別

//bfs函數
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類似,不同的是,拓樸排序演算法不會立即輸出已存取的頂點,而是存取目前頂點鄰接表中的所有相鄰頂點,直到這個清單窮盡時,才會將目前頂點壓入棧中。

拓樸排序演算法被分割為兩個函數,第一個函數是topSort(),用來設定排序程序並呼叫一個輔助函數topSortHelper(),然後顯示排序好的頂點列表

拓撲排序演算法主要工作是在遞歸函數topSortHelper()中完成的,這個函數會將當前頂點標記為已訪問,然後遞歸訪問當前頂點鄰接表中的每個頂點,標記這些頂點為已訪問。最後,將目前頂點壓入堆疊中。

複製程式碼 程式碼如下:

//topSort()函數
function topSort(){
    var stack = [];
    var visited = [];
    for(var i =0;i         visited[i] = false;
    }
    for(var i = 0;i         if(visited[i] == false){
            this.topSortHelper(i,visited,stack);
        }
    }
    for(var i = 0;i         if(stack[i] !=undefined && stack[i] != false){
            print(this.vertexList[stack[i]]);
        }
    }
}

//topSortHelper()函數
function topSortHelper(v,visited,stack){
    visited[v] = true;
    for each(var w in this.adj[v]){
        if(!visited[w]){
            this.topSortHelper(visited[w],visited,stack);
        }
    }
    stack.push(v);
}

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

使用C++實現機器學習演算法:常見挑戰及解決方案 使用C++實現機器學習演算法:常見挑戰及解決方案 Jun 03, 2024 pm 01:25 PM

C++中機器學習演算法面臨的常見挑戰包括記憶體管理、多執行緒、效能最佳化和可維護性。解決方案包括使用智慧指標、現代線程庫、SIMD指令和第三方庫,並遵循程式碼風格指南和使用自動化工具。實作案例展示如何利用Eigen函式庫實現線性迴歸演算法,有效地管理記憶體和使用高效能矩陣操作。

探究C++sort函數的底層原理與演算法選擇 探究C++sort函數的底層原理與演算法選擇 Apr 02, 2024 pm 05:36 PM

C++sort函數底層採用歸併排序,其複雜度為O(nlogn),並提供不同的排序演算法選擇,包括快速排序、堆排序和穩定排序。

使用Java函數比較進行複雜資料結構比較 使用Java函數比較進行複雜資料結構比較 Apr 19, 2024 pm 10:24 PM

Java中比較複雜資料結構時,使用Comparator提供靈活的比較機制。具體步驟包括:定義比較器類,重寫compare方法定義比較邏輯。建立比較器實例。使用Collections.sort方法,傳入集合和比較器實例。

改進的檢測演算法:用於高解析度光學遙感影像目標檢測 改進的檢測演算法:用於高解析度光學遙感影像目標檢測 Jun 06, 2024 pm 12:33 PM

01前景概要目前,難以在檢測效率和檢測結果之間取得適當的平衡。我們研究了一種用於高解析度光學遙感影像中目標偵測的增強YOLOv5演算法,利用多層特徵金字塔、多重偵測頭策略和混合注意力模組來提高光學遙感影像的目標偵測網路的效果。根據SIMD資料集,新演算法的mAP比YOLOv5好2.2%,比YOLOX好8.48%,在偵測結果和速度之間達到了更好的平衡。 02背景&動機隨著遠感技術的快速發展,高解析度光學遠感影像已被用於描述地球表面的許多物體,包括飛機、汽車、建築物等。目標檢測在遠感影像的解釋中

Java資料結構與演算法:深入詳解 Java資料結構與演算法:深入詳解 May 08, 2024 pm 10:12 PM

資料結構與演算法是Java開發的基礎,本文深入探討Java中的關鍵資料結構(如陣列、鍊錶、樹等)和演算法(如排序、搜尋、圖演算法等)。這些結構透過實戰案例進行說明,包括使用陣列儲存分數、使用鍊錶管理購物清單、使用堆疊實現遞歸、使用佇列同步執行緒以及使用樹和雜湊表進行快速搜尋和身份驗證等。理解這些概念可以編寫高效且可維護的Java程式碼。

演算法在 58 畫像平台建置中的應用 演算法在 58 畫像平台建置中的應用 May 09, 2024 am 09:01 AM

一、58畫像平台建置背景首先和大家分享下58畫像平台的建造背景。 1.傳統的畫像平台傳統的想法已經不夠,建立用戶畫像平台依賴數據倉儲建模能力,整合多業務線數據,建構準確的用戶畫像;還需要數據挖掘,理解用戶行為、興趣和需求,提供演算法側的能力;最後,還需要具備數據平台能力,有效率地儲存、查詢和共享用戶畫像數據,提供畫像服務。業務自建畫像平台和中台類型畫像平台主要區別在於,業務自建畫像平台服務單條業務線,按需定制;中台平台服務多條業務線,建模複雜,提供更為通用的能力。 2.58中台畫像建構的背景58的使用者畫像

PHP資料結構:AVL樹的平衡之道,維持高效有序的資料結構 PHP資料結構:AVL樹的平衡之道,維持高效有序的資料結構 Jun 03, 2024 am 09:58 AM

AVL樹是一種平衡二元搜尋樹,確保快速且有效率的資料操作。為了實現平衡,它執行左旋和右旋操作,調整違反平衡的子樹。 AVL樹利用高度平衡,確保樹的高度相對於節點數始終較小,從而實現對數時間複雜度(O(logn))的查找操作,即使在大型資料集上也能保持資料結構的效率。

基於全域的圖增強的新聞推薦演算法 基於全域的圖增強的新聞推薦演算法 Apr 08, 2024 pm 09:16 PM

作者|汪昊審校|重樓新聞App是人們日常生活中獲取資訊來源的重要方式。在2010年左右,國外比較火的新聞App包括Zite和Flipboard等,而國內比較火的新聞App主要是四大門戶。而隨著今日頭條為代表的新時代新聞推薦產品的火爆,新聞App進入了全新的時代。而科技公司,不管哪一家,只要掌握了高精尖的新聞推薦演算法技術,就基本在技術層面掌握了主動權和話語權。今天,我們來看看RecSys2023的最佳長篇論文提名獎論文-GoingBeyondLocal:GlobalGraph-EnhancedP

See all articles