python 數據結構之圖的儲存方式


參考鏈接:https://blog.csdn.net/u014281392/article/details/79120406

所描述的圖的結構為:

下面介紹不同的儲存方式,我想不必詳細分別是每個名稱都是那種數據來存儲的,或是一種,或是兩種的組合,這不是再通用的規定約束而來的結果,只是列舉了一些靈活的組合而已。

1.鄰接集合

鄰接集合就是把頂點的鄰接點放在一個集合中

# 將節點的編號賦值給相應的節點,方便操作
a, b, c, d, e, f, g, h = range(8)
N = [{'b', 'c', 'd', 'e', 'f'},
     {'c', 'e'},
     {'d'},
     {'e'},
     {'f'},
     {'c', 'g', 'h'},
     {'f', 'h'},
     {'f', 'g'}]
列表中每個集合是每個節點鄰接點集
在python2.7中,set([1,3])這樣表示,set()表示空集合.
在python3之后的版中,set{1,3}表示集合,空集合仍用set()表示.

  

#查看a的鄰接節點有哪些
N[a]

{'b', 'c', 'd', 'e', 'f'}

# 檢查g是否為a的一個鄰接節點
'g' in N[a]

False

# 節點a的度
len(N[a])

5

  

2.鄰接列表

數據結構和鄰接集合差不多,唯一的不同是用列表來儲存

# 表示同一個圖
a, b, c, d, e, f, g, h = range(8)
N = [ ['b', 'c', 'd', 'e', 'f'],
      ['c', 'e'],
      ['d'],
      ['e'],
      ['f'],
      ['c', 'g', 'h'],
      ['f', 'h'],
      ['f', 'g'] ]
# 鄰接列表表示圖結構,與鄰接集合的操作相同

  

3.鄰接字典

臨界字典與前面兩個的不同之處在於,其不僅采用字典來儲存,字典是鍵值對,鍵值對中的value用來表示邊的權值這一信息,能表示出與鄰居節點之間的關聯性

a, b, c, d, e, f, g, h = range(8)
N = [{'b':2, 'c':1, 'd':3, 'e':9, 'f':4},
     {'c':4, 'e':3},
     {'d':8},
     {'e':7},
     {'f':5},
     {'c':2, 'g':2, 'h':2},
     {'f':1, 'h':6},
     {'f':9, 'g':8}]

#操作
'e' in N[a]
True

 邊的權值
N[a]['c']

1

  

4.嵌套字典

不用添加序號了 

# 以上三種圖的表示,都是使用了list類型
# 下面使用嵌套的字典結構
N = {'a':{'b':2, 'c':1, 'd':3, 'e':9, 'f':4},
     'b':{'c':4, 'e':3},
     'c':{'d':8},
     'd':{'e':7},
     'e':{'f':5},
     'f':{'c':2, 'g':2, 'h':2},
     'g':{'f':1, 'h':6},
     'h':{'f':9, 'g':8}}

  其他的操作和別的結構相同

# a,e之間鏈接權值
N['a']['e']

  

4.鄰接矩陣

# 鄰接矩陣,通過一個二維數組,對應圖中的每個節點,使用0,1來表示相關節點是否為當前節點的鄰居
# 可以使用嵌套list實現
a, b, c, d, e, f, g, h = range(8)

N = [[0, 1, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 0, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 1, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 0, 1],
[0, 0, 0, 0, 0, 1, 1, 0]]

  

# 檢查a, b是否為相鄰節點,即檢查N[a][b]是否為1
N[a][b] == 1

True

  

# c節點的度 sum(N[c])

擴展鄰接矩陣,實現一個沒有自循環,對邊加權 、無自循環狀態,對角線元素全部為0 、加權,用權值替換真值 、將不存在的邊設置一個去窮大的權值(float('inf')),或None

a, b, c, d, e, f, g, h = range(8)
inf = float('inf')

N = [[  0,   2,   1,   3,   9,   4, inf, inf],
     [inf,   0,   4, inf,   3, inf, inf, inf],
     [inf, inf,   0,   8, inf, inf, inf, inf],
     [inf, inf, inf,   0,   7, inf, inf, inf],
     [inf, inf, inf, inf,   0,   5, inf, inf],
     [inf, inf,   2, inf, inf,   0,   2,   2],
     [inf, inf, inf, inf, inf,   1,   0,   6],
     [inf, inf, inf, inf, inf,   9,   8,   0]]

  

# 檢查a,b是否互為相鄰節點,只要鄰接權值不是無窮大
N[a][b] < inf

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM