日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

数据结构之图:无向图的介绍与功能实现,Python——22

發布時間:2024/7/5 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构之图:无向图的介绍与功能实现,Python——22 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

無向圖(Undigraph)的介紹

引入

  • 生活中的圖,有地圖,集成電路板的圖,可以看類似的看做是數據結構中的圖
  • 數據有"一對一",“一對多”和“多對多”的關系,前兩種分別表示線性表和樹的存儲結構性質,而多對多則可表示圖的存儲結構性質

定義

  • 圖是由有限的(并且可能是可變的)組的頂點(vertices,或稱點points,結點nodes),以及一系列由這些每兩個頂點之間相連的有向或無向的邊(edges,或稱鏈接links,線lines),組合而成的一種數據結構

圖的分類
按照連接兩個頂點的邊的不同,可以把圖分為以下兩種:

  • 無向圖:邊僅僅連接兩個頂點,沒有其他含義;
  • 有向圖:邊不僅連接兩個頂點,并且具有方向;

圖中的術語

  • 和相鄰頂點: 當兩個頂點通過一邊相連時,我們稱這兩個頂點是相鄰的,并且稱這條邊依附于這兩個頂點。
  • 度:某個頂點的度就是依附于該頂點的邊的個數
  • 子圖:是一幅圖中由一部分的邊及其連接的頂點的組成的子集;
  • 路徑:由邊順序連接的一系列的頂點組成
  • 環:是一條至少含有一條邊且終點和起點相同的路徑(示例圖中的紅色環)
  • 連通圖:如果圖中任意一個頂點都存在一條路徑到達另外一 個頂點,那么這幅圖就稱之為連通圖
  • 連通子圖:一個非連通圖由若干連通的部分組成,每一個連通的部分 都可以稱為該圖的連通子圖

無向圖

圖的存儲結構
要表示一幅圖,只需要表示清楚以下兩部分內容即可:

  • 圖中所有的頂點;
  • 所有連接頂點的邊;
  • 常見的圖的存儲結構有兩種:鄰接矩陣和鄰接表
    鄰接矩陣
    3. 使用一個V*V的二維數組int[V][V] adj,把索引的值看做是頂點; .
    4. 如果頂點v和頂點w相連,我們只需要將adj[v][w]和adj[w][v]的值設置為1,否則設置為0即可。

    解釋:
    使用二維數組表示一個圖,二維數組有兩個維度的索引,這兩套索引都表示圖的頂點,當我們要查看兩個頂點之間是否相連通時,例如查看頂點A是否連通頂點B(存在方向A→B),我們就查看這兩個頂點一維索引A和二維索引B對應的值即可,這里我們定義如果值為1就表示連通,如果為0則表示不連通。
    很明顯,鄰接矩陣這種存儲方式的空間復雜度是V^2的,如果我們處理的問題規模比較大的話,內存空間極有可能不夠用。

    鄰接表

  • 使用一個大小為V的數組Queue[V] adj ,把索弓|看做是頂點; .
  • 每個索|處adj[V]存儲了一個隊列,該隊列中存儲的是所有與該頂點相鄰的其他頂點儲存相連的頂點的數據結構是隊列,有序的

    解釋:鄰接表由一個數組儲存圖的頂點,這個數組連接了與頂點數量相同的邊,這些邊用隊列queue存儲,如果圖中A頂點與B相連(無方向,互相連通),則B會出現在A頂點連接的queue中,同時A也會出現在B連接的queue中
    使用鄰接表可以很大的減少不必要的空間浪費
  • 主要方法與屬性

  • self.vertex 表示傳入圖中定義的頂點數量
  • self.edge 邊的數量,初始化為0,隨著添加邊的方法的調用而增加
  • self.adj_list 一個列表,對應的是上圖中使用的鄰接表,索引代表頂點,每個索引中又儲存了一個包含它的所有相鄰邊的列表
  • add_edge(x, y) 將傳入的兩個頂點相連,構造一條邊
  • get_edges_of(v) 獲取頂點v的相鄰邊
  • 無向圖Python代碼實現與測試

    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())

    運行結果

    [5, 7, 8] 6 10

    總結

    以上是生活随笔為你收集整理的数据结构之图:无向图的介绍与功能实现,Python——22的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。