1. 程式人生 > >視覺化圖的基本演算法

視覺化圖的基本演算法

0. About

關於圖的基本表示與基本演算法,包括圖的鄰接表和鄰接矩陣表示法;圖的廣度優先(BFS)與深度優先(DFS)搜尋演算法;最小權生成樹問題的 Kruskal 演算法與 Prim 演算法;單源最短路徑的 Dijkstra 演算法。

1. 鄰接表與鄰接矩陣表示

鄰接表表示法就是將圖的每個節點儲存在陣列中,每個節點指向與之相鄰的節點所組成的連結串列:

1234567891011121314151617181920212223242526 classGraphTable:def __init__(self,nodes,edges,is_dir=False):self.nodes=nodesself.edges=edgesself.is_dir=is_dirself.graph=[]fornode innodes:self.graph.append([node])foredge inedges:forninself.graph:ifn[0]==edge[0]:n.append
(edge[1])ifnotis_dir:ifn[0]==edge[1]:n.append(edge[0])self.G=Nonedef __str__(self):return'n'.join([str(n)forninself.graph])def draw(self):settings=dict(name='Graph',engine='circo',node_attr=dict(shape='circle'),format='png')self.G=Digraph(**settings)ifself.is_dir elseGraph(**settings)fornode inself.nodes
:self.G.node(str(node),str(node))foredge inself.edges:self.G.edge(str(edge[0]),str(edge[1]))returnself.G
12345678910 gt=GraphTable([1,2,3,4,5],[(1,2),(1,5),(2,5),(2,4),(5,4),(2,3),(3,4)])print(gt)gt.draw()"""[1, 2, 5][2, 1, 5, 4, 3][3, 2, 4][4, 2, 5, 3][5, 1, 2, 4]"""

鄰接表無向圖

12345678910 dgt=GraphTable([1,2,3,4,5],[(1,2),(1,5),(2,5),(2,4),(5,4),(2,3),(3,4)],is_dir=True)print(dgt)dgt.draw()"""[1, 2, 5][2, 5, 4, 3][3, 4][4][5, 4]"""

鄰接表有向圖

鄰接矩陣表示法則是用一個 N 階矩陣來表示,其中任意兩個節點所對應的矩陣中的值為0或1表示兩個節點是否相連通:

1234567891011121314 classGraphMatrix:def __init__(self,nodes,edges,is_dir=False):self.nodes=nodesself.edges=edgesself.graph=[]for_inrange(len(nodes)):self.graph.append([0]*len(nodes))for(x,y)inedges:self.graph[x-1][y-1]=1ifnotis_dir:self.graph[y-1][x-1]=1def __str__(self):returnstr('n'.join([str(i)foriinself.graph]))
123456789 gm=GraphMatrix([1,2,3,4,5],[(1,2),(1,5),(2,5),(2,4),(5,4),(2,3),(3,4)])print(gm)"""[0, 1, 0, 0, 1][1, 0, 1, 1, 1][0, 1, 0, 1, 0][0, 1, 1, 0, 1][1, 1, 0, 1, 0]"""
123456789 dgm=GraphMatrix([1,2,3,4,5],[(1,2),(1,5),(2,5),(2,4),(5,4),(2,3),(3,4)],is_dir=True)print(dgm)"""[0, 1, 0, 0, 1][0, 0, 1, 1, 1][0, 0, 0, 1, 0][0, 0, 0, 0, 0][0, 0, 0, 1, 0]"""

這兩種表示方法都可以很容易地擴充套件為加權圖,對於比較稀疏的圖(定點數遠大於邊的數量)通常採用鄰接表表示法,後面涉及到的演算法均採用鄰接表表示法。

2. 廣度優先搜尋與深度優先搜尋

廣度優先搜尋就是按層遍歷樹時用到的思想,即先儘可能多地訪問直接相連的節點,再向深處延伸,因此需要使用佇列儲存訪問過的節點。

123456789 # 定義一個列舉型別,用於標記訪問過的節點的狀態# WHITE 表示未檢視過# GRAY 表示檢視過但未訪問# BLACK 表示已經訪問過import enumclassColor(enum.Enum):WHITE=0GRAY=1BLACK=2
123456789101112131415161718192021222324252627 # 需要向 GraphTable 新增方法 adjs 用於# 查詢所有與某節點直接相連的節點def adjs(self,node):returnlist(filter(lambdan:n[0]==node,self.graph))[0][1:]def BFS(G,s):color={}dists={}parent={}fornode inG.graph:color[node[0]]=Color.WHITEdists[node[0]]=-1parent[node[0]]=Nonecolor[s]=Color.GRAYdists[s]=0queue=[s]whilelen(queue):cursor=queue.pop(0)forvinG.adjs(cursor):ifcolor[v]==Color.WHITE:color[v]=Color.GRAYdists[v]=dists[cursor]+1parent[v]=cursorqueue.append(v)color[cursor]=Color.BLACKprint("[{}] visited!".format(cursor))returnparent

返回的 parent 儲存了每個被訪問節點的上一個節點,可以通過遞迴找出訪問路徑:

1234567891011121314151617181920212223

相關推薦

視覺基本演算法

0. About 關於圖的基本表示與基本演算法,包括圖的鄰接表和鄰接矩陣表示法;圖的廣度優先(BFS)與深度優先(DFS)搜尋演算法;最小權生成樹問題的 Kruskal 演算法與 Prim 演算法;單源最短路徑的 Dijkstra 演算法。 1. 鄰接表與鄰接矩陣表示 鄰接表表

Matplotlib資料視覺——

import matplotlib.pyplot as plt """ 圖中圖實驗 """ # 繪製大圖 fig = plt.figure() # 使用figure後往往在函式前要加set_或add_等字首 x = [1,2,3,4,5,6,7] y = [1,3,4,2,5,8,

第十一週 【專案1-基本演算法庫】

/*   *Copyright  (c)2017,煙臺大學計算機與控制工程學院       *All rights reservrd.       *作者:趙楷文  *完成時間:2017年11月09日       *版本號:v1.0       *問題描述:圖

雙目視覺---影象匹配基本演算法總結

為了以後查詢方便,就先存下來吧!(原文:http://blog.csdn.net/hujingshuang/article/details/47759579) 簡介:        本文主要介紹幾種基於灰度的影象匹配演算法:平均絕對差演算法(MAD)、絕對誤差和演算法(S

Python資料分析及視覺基本環境

首先搭建基本環境,假設已經有Python執行環境。然後需要裝上一些通用的基本庫,如numpy, scipy用以數值計算,pandas用以資料分析,matplotlib/Bokeh/Seaborn用來資料視覺化。再按需裝上資料獲取的庫,如Tushare(http://pyth

視覺歸併排序演算法

今天又有一點空,寫了歸併排序,並用swing動畫顯示了排序過程。 像諸如氣泡排序的話,如果想對排序過程做視覺化。那麼只要簡單的在每個繪圖主迴圈中重繪整個資料就行了。 但是,歸併排序不一樣,因為它的排序過程是不停建立一些中間小陣列來儲存,然後不停合併這些陣列,最後實現排

2015年大二上-資料結構--1-(1)基本演算法

圖的儲存結構主要包括鄰接矩陣和鄰接表,本演算法庫提供儲存結構的定義,以及用於構造圖儲存結構、不同結構的轉換及顯示的程式碼。演算法庫採用程式的多檔案組織形式,包括兩個檔案:      1.標頭檔案:Graph.h,包含定義圖資料結構的程式碼、巨集定義、要實現演算法的函式的宣

資料視覺基本圖表

"資料視覺化"可以幫助使用者理解資料,一直是熱門方向。 圖表是"資料視覺化"的常用手段,其中又以基本圖表----柱狀圖、折線圖、餅圖等等----最為常用。 使用者非常熟悉這些圖表,但如果被問道,它們的特點是什麼,最適用怎樣的場合(資料集)?恐怕答得上來的人就不多了。 零、序言 進入正題之前,

第12周專案1 基本演算法

問題: /*  * Copyright (c)2015,煙臺大學計算機與控制工程學院  * All rights reserved.  * 檔名稱:專案1.cpp  * 作    者:張芸嘉  * 完成日期:2015年11月23日  * 版 本 號:v1.0    * 問題

在ASP.NET Core中建立自定義端點視覺

在[上篇文章中](https://www.cnblogs.com/yilezhu/p/13336066.html),我為構建自定義端點視覺化圖奠定了基礎,正如我[在第一篇文章中](https://www.cnblogs.com/yilezhu/p/13301981.html)展示的那樣。該圖顯示了端點路由的不

資料結構-基於鄰接矩陣實現的遍歷視覺及使用Floyd、Dijkstra演算法求解最短路徑(JavaScript實現)

使用 JavaScript 基於鄰接矩陣實現了圖的深度、廣度遍歷,以及 Floyd、Dijkstra 演算法求解最短路徑。另外使用 SVG 實現圖的遍歷視覺化。一、輸入首先,輸入資料主要有兩個,一個是存放節點名的陣列,另一個是存放邊物件的陣列。例如://存放圖結點的陣列 va

資料結構-基於鄰接表實現的遍歷視覺及使用Floyd、Dijkstra演算法求解最短路徑(JavaScript實現)

使用 JavaScript 基於鄰接表實現了圖的深度、廣度遍歷,以及 Floyd、Dijkstra 演算法求解最短路徑。另外使用 SVG 實現圖的遍歷視覺化。<!DOCTYPE html> <html lang="en"> <head>

抵千言:帶你瞭解最直觀的神經網路架構視覺

一張好的圖抵得上一千個等式。 神經網路是複雜、多維、非線性的陣列運算。如何在避免過於複雜或重複的情況下呈現深度學習模型架構的重要特徵呢?又該以何種方式清晰直觀、啟發性地呈現它們呢?(好看也是加分項!)無論研究還是教學專案對此都沒有固定標準。本文我們就來了解一下視覺化整個

資料視覺:淺談熱力如何在前端實現

作者 個推開發工程師甄鑫 當我們需要用更直觀有效的形式來展現各類大資料資訊時,熱力圖無疑是一種很好的方式。作為一種密度圖,熱力圖一般使用具備顯著顏色差異的方式來呈現資料效果,熱力圖中亮色一般代表事件發生頻率較高或事物分佈密度較大,暗色則反之。 值得一提的是,熱力圖最終效果常常優於

——基本演算法(四)關鍵路徑

圖——基本的圖演算法(四)關鍵路徑 1. 基本概念 (1)AOV網(Activity On Vertex Network) AOV網是一個表示工程的有向圖中,其中的頂點用來表示活動,弧則用來表示活動之間的優先關係。舉個簡單的例子,假定起床後可以邊煮水,邊刷牙洗臉,但洗臉要在刷牙後

——基本演算法(三)拓撲排序

圖——基本的圖演算法(三)拓撲排序 1. 基本概念 對於一個有向無環圖G = (V, E)來說,其拓撲排序就是G中所有頂點的一種線性排序,這種排序滿足如下條件:如果圖G中包含邊(a, b),即由頂點a指向頂點b的有向邊,那麼在G的拓撲排序中,頂點a一定處於頂點b前面(因此如果有向

——基本演算法(二)的遍歷

圖——基本的圖演算法(二)圖的遍歷 1. 基本概念 圖的遍歷指的是從圖中的某個頂點出發訪問圖中其餘的頂點,且每個頂點只被訪問一次的這個過程。通常來說,圖的遍歷次序有兩種:深度優先遍歷(Depth first Search, DFS)和廣度優先遍歷(Breadth First Se

kafka視覺客戶端工具(Kafka Tool)的基本使用

1、下載 下載地址:http://www.kafkatool.com/download.html   2、安裝 根據不同的系統下載對應的版本,我這裡kafka版本是1.1.0,下載kafka tool 2.0.1。 雙擊下載完成的exe圖示,傻瓜式完成安裝。 3、簡單使用

matplotlib學習——資料視覺基本處理

引:現打算將曾經學習的資料處理方面的知識回顧一下,並做成筆記,從matplotlib開始記起 ----環境搭建:使用Anaconda,較為方便,如果認為不需要過多的東西,可以使用pip安裝 pip安裝命令:pip3 install matplotlib Anaconda下載地址:http

tensorflow基本教程6:視覺結果

#如何建立神經網路的結構:層 import tensorflow as tf import numpy as np import matplotlib.pyplot as plt def add_layer(inputs,in_size,out_size,activation_function=