数据结构之图:无向图的介绍与功能实现,Python——22
生活随笔
收集整理的這篇文章主要介紹了
数据结构之图:无向图的介绍与功能实现,Python——22
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
無向圖(Undigraph)的介紹
引入
- 生活中的圖,有地圖,集成電路板的圖,可以看類似的看做是數(shù)據(jù)結(jié)構(gòu)中的圖
- 數(shù)據(jù)有"一對一",“一對多”和“多對多”的關(guān)系,前兩種分別表示線性表和樹的存儲結(jié)構(gòu)性質(zhì),而多對多則可表示圖的存儲結(jié)構(gòu)性質(zhì)
定義
- 圖是由有限的(并且可能是可變的)組的頂點(vertices,或稱點points,結(jié)點nodes),以及一系列由這些每兩個頂點之間相連的有向或無向的邊(edges,或稱鏈接links,線lines),組合而成的一種數(shù)據(jù)結(jié)構(gòu)
圖的分類
按照連接兩個頂點的邊的不同,可以把圖分為以下兩種:
- 無向圖:邊僅僅連接兩個頂點,沒有其他含義;
- 有向圖:邊不僅連接兩個頂點,并且具有方向;
圖中的術(shù)語
- 和相鄰頂點: 當(dāng)兩個頂點通過一邊相連時,我們稱這兩個頂點是相鄰的,并且稱這條邊依附于這兩個頂點。
- 度:某個頂點的度就是依附于該頂點的邊的個數(shù)
- 子圖:是一幅圖中由一部分的邊及其連接的頂點的組成的子集;
- 路徑:由邊順序連接的一系列的頂點組成
- 環(huán):是一條至少含有一條邊且終點和起點相同的路徑(示例圖中的紅色環(huán))
- 連通圖:如果圖中任意一個頂點都存在一條路徑到達另外一 個頂點,那么這幅圖就稱之為連通圖
- 連通子圖:一個非連通圖由若干連通的部分組成,每一個連通的部分 都可以稱為該圖的連通子圖
無向圖
圖的存儲結(jié)構(gòu)
要表示一幅圖,只需要表示清楚以下兩部分內(nèi)容即可:
常見的圖的存儲結(jié)構(gòu)有兩種:鄰接矩陣和鄰接表
鄰接矩陣
3. 使用一個V*V的二維數(shù)組int[V][V] adj,把索引的值看做是頂點; .
4. 如果頂點v和頂點w相連,我們只需要將adj[v][w]和adj[w][v]的值設(shè)置為1,否則設(shè)置為0即可。
解釋:
使用二維數(shù)組表示一個圖,二維數(shù)組有兩個維度的索引,這兩套索引都表示圖的頂點,當(dāng)我們要查看兩個頂點之間是否相連通時,例如查看頂點A是否連通頂點B(存在方向A→B),我們就查看這兩個頂點一維索引A和二維索引B對應(yīng)的值即可,這里我們定義如果值為1就表示連通,如果為0則表示不連通。
很明顯,鄰接矩陣這種存儲方式的空間復(fù)雜度是V^2的,如果我們處理的問題規(guī)模比較大的話,內(nèi)存空間極有可能不夠用。
鄰接表
解釋:鄰接表由一個數(shù)組儲存圖的頂點,這個數(shù)組連接了與頂點數(shù)量相同的邊,這些邊用隊列queue存儲,如果圖中A頂點與B相連(無方向,互相連通),則B會出現(xiàn)在A頂點連接的queue中,同時A也會出現(xiàn)在B連接的queue中
使用鄰接表可以很大的減少不必要的空間浪費
主要方法與屬性
無向圖Python代碼實現(xiàn)與測試
class Undigraph:def __init__(self, v):self.vertex = vself.edge = 0self.adj_list = [i for i in range(v)]self.v_edges = [[] for _ in range(v)]def num_of_vertices(self):return self.vertexdef num_of_edges(self):return self.edgedef add_edge(self, x: int, y: int):"""Cuz this is a undirected graph, x -> v is equals to v -> x"""if y not in self.v_edges[x]:self.v_edges[x].append(y)if x not in self.v_edges[y]:self.v_edges[y].append(x)self.edge += 1def get_edges_of(self, v):return self.v_edges[v]if __name__ == '__main__':UG = Undigraph(10)UG.add_edge(2, 5)UG.add_edge(1, 4)UG.add_edge(3, 9)UG.add_edge(6, 7)UG.add_edge(2, 7)UG.add_edge(2, 8)print(UG.get_edges_of(2))print(UG.num_of_edges())print(UG.num_of_vertices())運行結(jié)果
[5, 7, 8] 6 10總結(jié)
以上是生活随笔為你收集整理的数据结构之图:无向图的介绍与功能实现,Python——22的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阅读英文论文的方法总结(三遍法)
- 下一篇: spark应用程序转换_Spark—RD