當前位置:首頁 » 編程語言 » python鄰接表

python鄰接表

發布時間: 2023-04-17 23:04:50

1. 用python實現鄰接矩陣轉換為鄰接表,python語言實現

  • graph = {'A': ['B', 'C'],

  • 'B': ['C', 'D'],

  • 'C': ['D'],

  • 'D': ['C','G','H'],

  • 'E': ['F'],

  • 'F': ['C']}

  • #從圖中找出任意一條從起始頂點到終止頂點的路徑

  • def find_path(graph, start, end, path=[]):

  • if start == end:

  • print "path", path

  • return True

  • if not graph.get(start):

  • path.pop()

  • return False

  • for v in graph[start]:

  • if v not in path:

  • path.append(v)

  • if find_path(graph,v,end,path):

  • return True

  • return False

  • path = []

  • if find_path(graph, 'A', 'C', path=path):

  • print(path)

  • else:

  • print(1)

  • #從圖中找出從起始頂點到終止頂點的所有路徑

  • import

  • def find_path_all(curr, end, path):

  • '''

  • :param curr: 當前頂點

  • :param end: 要到達的頂點

  • :param path: 當前襪搭段頂點的一條父路徑

  • :return:

  • '''

  • if curr == end:

  • path_tmp = .deep(path)

  • path_all.append(path_tmp)

  • return

  • if not graph.get(curr):

  • return

  • for v in graph[curr]:

  • #一個頂點在當前遞歸路徑中只能出現一次,否則會陷入死循環。

  • if v in path:

  • print("v %s in path %s" %(v, path))

  • continue

  • #構造下次遞歸的父路徑

  • path.append(v)

  • find_path_all(v,end,path)

  • path.pop()

  • path_all = []

  • find_path_all('A', 'G',path=['A'])

  • print path_all

  • #遍歷圖中所有頂點,按照遍歷枝舉順序將頂告譽點添加到列表中

  • vertex = []

  • def dfs(v):

  • if v not in graph:

  • return

  • for vv in graph[v]:

  • if vv not in vertex:

  • vertex.append(vv)

  • dfs(vv)

  • for v in graph:

  • if v not in vertex:

  • vertex.append(v)

  • dfs(v)

  • print(vertex)

2. MapRece之金庸的江湖人物分析項目

通過一個綜合數據分析案例:」金庸的江湖——金庸武俠小說中的人物關系挖掘「,來學習和掌握MapRece程序設計。通過本項目的學習,可以體會如何使用MapRece完成一個綜合性的數據挖掘任務,包括全流程的數據預處理、數據分析、數據後處理等。
1 任務1 數據預處理
1.1 任務描述
從原始的金庸小說文本中,抽取出與人物互動相關的數據,而屏蔽掉與人物關系無關的文本內容,為後面的基於人物共現的分析做准備。

1.2 關鍵問題
1.2.1 中文分詞和人名提取
使用開源的Ansj_seg進行分詞。Ansj_seg不僅支持中文分詞,還允許用戶自定義詞典,在分詞前,將人名列表到添加用戶自定義的詞典,可以精確識別金庸武俠小說中的人名。
但實際測試的時候發現,Ansj_seg分詞會出現嚴重的歧義問題,比如「漢子」屬於人名列表中的人名(nr),但Ansj_seg可能會錯誤地將它分類為名詞(n)。因此,如果根據詞性提取人名,會導致最後提取的人名太少。解決方法是在提取人名的時候,需要在將人名加入用戶自定義詞典的同時,構造一個包含所有人名的字典,對分詞的結果逐個進行測試,如果在字典里,就是人名。
1.2.2 文件傳輸
使用HDFS傳遞數據。考慮到人名列表文件已經存放在了HDFS里,所以使用HDFS的方式不需要移動人名列表文件,只需要在Configuration中設置文件在HDFS文件系統中的路徑,然後在Mapper的setup()函數里調用HDFS的函數獲取文件內容即可。
1.2.3 單詞同現演算法
兩個單詞近鄰關系的定義:實驗要求中已經說明,同現關系為一個段落。
段落劃分:非常慶幸的是,小說原文中一個段落就是一行,因此,不需要自己定義FileInputFormat和RecordReader。
1.3 MapRece設計
1.3.1 Mapper

1.3.2 Recer

1.3.3 Driver

2 任務2 特徵抽取:人物同現統計
2.1 任務描述
完成基於單詞同現演算法的人物同現統計。在人物同現分析中,如果兩個人在原文的同一段落中困嫌出現,則認為兩個人發生了一次同現關系。我們需要對人物之間的同現關系次數進行統計,同現關系次數越多,則說明兩人的關系越密切。

2.2 關鍵問題
2.2.1 人名冗餘
在同一段中,人名可能多次出現,任務一隻負責提取出所有的人名,沒有剔除多餘的人名,任務必須在輸出同現次數之前汪簡手處理冗餘人名。我的做法是在Mapper中創建一個集合,把所有人名放入集合中,集合會自動剔除冗餘的人名。
2.2.2 同現次數統計
兩個人物之間應該輸出兩個鍵值對,如「狄雲」和「戚芳」,應該輸出「<狄雲,戚芳> 1」和「<戚芳,狄雲> 1」。多個段落中允許輸出相同的鍵值對,因此,Recer中需要整合具有相同鍵的輸出,輸出總的同現次數。
2.3 MapRece設計
2.3.1 Mapper

2.3.2 Recer

3 任務3 特徵處理:人物關系圖構建與特徵歸一化
3.1 任務描述
根據任務2人物之間的共現關系,生成人物之間的關系圖。人物關系使用鄰接表的形式表示,人物是頂點,人物之間關系是邊,兩個人的關系的密切程度由共現次數體現,共現次數越高,邊權重越高。另外需要對共現次數進行歸一化處理,確保某個頂點的出邊權重和為1。

3.2 關鍵問題
3.2.1 確保人物的咐攜所有鄰居輸出到相同結點處理
在Mapper結點將輸入的鍵值對「<狄雲,戚芳> 1」拆分,輸出新的鍵值對「<狄雲> 戚芳:1」,「狄雲」的所有鄰居會被分配給同一個Recer結點處理。
3.2.2 歸一化
在Recer結點首先統計該人物與所有鄰居同現的次數和sum,每個鄰居的的同現次數除以sum就得到共現概率。為了提高效率,在第一次遍歷鄰居的時候,可以把名字和共現次數保存在鏈表裡,避免重復處理字元串。
3.3 MapRece設計
3.3.1 Mapper

3.3.2 Recer

4.1 任務描述
經過數據預處理並獲得任務的關系圖之後,就可以對人物關系圖作數據分析,其中一個典型的分析任務是:PageRank 值計算。通過計算 PageRank,我們就可以定量地獲知金庸武俠江湖中的「主角」們是哪些。
4.2 PageRank原理
PageRank演算法由Google的兩位創始人佩奇和布林在研究網頁排序問題時提出,其核心思想是:如果一個網頁被很多其它網頁鏈接到,說明這個網頁很重要,它的PageRank值也會相應較高;如果一個PageRank值很高的網頁鏈接到另外某個網頁,那麼那個網頁的PageRank值也會相應地提高。
相應地,PageRank演算法應用到人物關系圖上可以這么理解:如果一個人物與多個人物存在關系連接,說明這個人物是重要的,其PageRank值響應也會較高;如果一個PageRank值很高的人物與另外一個人物之間有關系連接,那麼那個人物的PageRank值也會相應地提高。一個人物的PageRank值越高,他就越可能是小說中的主角。
PageRank有兩個比較常用的模型:簡單模型和隨機瀏覽模型。由於本次設計考慮的是人物關系而不是網頁跳轉,因此簡單模型比較合適。簡單模型的計算公式如下,其中Bi為所有連接到人物i的集合,Lj為認為人物j對外連接邊的總數:

在本次設計的任務3中,已經對每個人物的邊權值進行歸一化處理,邊的權值可以看做是對應連接的人物占總邊數的比例。設表示人物i在人物j所有邊中所佔的權重,則PageRank計算公式可以改寫為:

4.3.2 PageRanklter類
GraphBuilder將數據處理成可供迭代的格式,PageRank的迭代過程由PageRanklter類實現,包含一個Map和Rece過程。Map過程產生兩種類型的<key,value>:<人物名,PageRrank值>,<人物名,關系鏈表>。第一個人物名是關系鏈表中的各個鏈出人物名,其PR值由計算得到;第二個人物名是本身人物名,目的是為了保存該人物的鏈出關系,以保證完成迭代過程。以上面的輸出為例,則Map過程產生的鍵值對為<完顏萍, 1.0 0.005037>,<小龍女, 1.0 0.017632>,……,<一燈大師, #完顏萍:0.005037783;……>。
Rece過程將同一人物名的<key,value>匯聚在一起,如果value是PR值,則累加到sum變數;如果value是關系鏈表則保存為List。遍歷完迭代器里所有的元素後輸出鍵值對<人物名,sum#List>,這樣就完成了一次迭代過程。
PR值排名不變的比例隨迭代次數變化的關系圖如下,由於我們考慮的是找出小說中的主角,所以只要關心PR值前100名的人物的排名的變化情況,可以看到迭代次數在10以後,PR值排名不變的比例已經趨於穩定了,所以基於效率考慮,選取10作為PR的迭代次數。
4.3.3 PageRankViewer類
當所有迭代都完成後,我們就可以對所有人物的PageRank值進行排序,該過程由PageRankViewer類完成,包含一個Map和Rece過程。Map過程只提取迭代過程輸出結果中的人物名以及對應的PageRank值,並以PageRank值作為key,人物名作為value輸出。為了實現PageRank值從大到小排序,需要實現DescFloatComparator類來重寫compare方法以達成逆序排序。由於可能存在PageRank值相同的情況,所以還需要一個rece過程來把因PageRank值相同而匯聚到一起的人物名拆開並輸出。

PageRankMapper

PageRankRecer

Driver類

5.1 任務描述
標簽傳播(Label Propagation)是一種半監督的圖分析演算法,他能為圖上的頂點打標簽,進行圖頂點的聚類分析,從而在一張類似社交網路圖中完成社區發現。在人物關系圖中,通過標簽傳播演算法可以將關聯度比較大的人物分到同一標簽,可以直觀地分析人物間的關系。
5.2 標簽傳播演算法原理
標簽傳播演算法(Label Propagation Algorithm,後面簡稱LPA)是由Zhu等人於2002年提出,它是一種基於圖的半監督學習方法,其基本思路是用已標記節點的標簽信息去預測未標記節點的標簽信息。LPA基本過程為:(1)每個結點初始化一個特定的標簽值;(2)逐輪更新所有節點的標簽,直到所有節點的標簽不再發生變化為止。對於每一輪刷新,節點標簽的刷新規則如下:對於某一個節點,考察其所有鄰居節點的標簽,並進行統計,將出現個數最多的那個標簽賦值給當前節點。當個數最多的標簽不唯一時,隨機選擇一個標簽賦值給當前節點。
LPA與PageRank演算法相似,同樣需要通過迭代過程來完成。在標簽傳播演算法中,節點的標簽更新通常有同步更新和非同步更新兩種方法。同步更新是指,節點x在t時刻的更新是基於鄰接節點在t-1時刻的標簽。非同步更新是指,節點x在t時刻更新時,其部分鄰接節點是t時刻更新的標簽,還有部分的鄰接節點是t-1時刻更新的標簽。若LPA演算法在標簽傳播過程中採用的是同步更新,則在二分結構網路中,容易出現標簽震盪的現象。在本次設計中,我們考慮到了兩種更新方法,並進行了比較。
5.3 標簽傳播演算法在maprece上的實現細節
5.3.1 LPAInit類
為實現LPA的迭代過程,需要先給每個人物賦予一個獨特標簽,標簽初始化由LPAInit類完成,僅包含一個Map過程。標簽由數字表示,Map過程由1開始,為每一個人物名賦予一個獨特的標簽。為了便於後面的可視化分析,我們需要把PageRank值和標簽整合在一起,所以LPAInit的輸入文件直接採用PageRank過程的輸出文件,格式如下:

5.3.2 LPAIteration類
LPAIteration類完成標簽的更新過程,其格式與LPAInit的輸出格式一致,包含一個Map和Rece過程。Map過程對輸入的每一行進行切割,輸出四種格式的<key,value>:<人物名,關系鏈表>,<人物名,PageRank值>,<人物名,標簽>,<鏈出人物名,標簽#起點人物名>。第四種格式個鍵值對是為了將該節點的標簽傳給其所有鄰居。
Rece過程對value值進行識別,識別可以通過Map過程把預先定義好的特殊字元如『#』、『@』來實現前綴到value上來實現。由於人物關系圖中的各個邊都是有權重的,並且代表兩個人物的相關程度,所以標簽更新過程不是用邊數最多的標簽而是權重最大標簽來更新,我們可以預先把權重最大的若干個保存到一個鏈表中,如果存在多個權重相同的標簽,則隨機選取一個作為該人名新的標簽。非同步方法更新標簽需要使用一個哈希表來存儲已經更新標簽的人物名和它們的新標簽,並且在更新標簽時使用該哈希表裡面的標簽。同步方法更新標簽則不需要存儲已更新的標簽。
本次設計中比較了同步和非同步更新兩種方法,下圖為標簽不變的比例隨迭代次數的變化。可以發現,非同步收斂速度更快,只要6次迭代即可完全收斂,且標簽不變的比例可達100%。而同步更新方法則不能達到100%,說明人物關系圖中存在子圖是二部子圖。
5.3.3 LPAReorganize類
LPA演算法迭代收斂後,所有人物名的標簽不再變化,但是此時的標簽排列是散亂的,需要把同一標簽的人物名整合在一起。該過程由LPAReorganize類完成,包含一個Map和Rece過程。Map過程對輸入的每一行進行切割,以<標簽,人物名#PageRank值#關系鏈表>格式輸出。Rece過程中,同一標簽的人物名匯聚在一起,然後根據每個標簽人物集合的大小從大到小排序,重新賦予標簽(從1開始)。這樣輸出文件中同一標簽的人物名就會聚集在一起。最後的輸出格式如下:

5.3.2 LPAMapper類
LPAIteration類完成標簽的更新過程,其格式與LPAInit的輸出格式一致,包含一個Map和Rece過程。Map過程對輸入的每一行進行切割,輸出四種格式的<key,value>:<人物名,關系鏈表>,<人物名,PageRank值>,<人物名,標簽>,<鏈出人物名,標簽#起點人物名>。第四種格式個鍵值對是為了將該節點的標簽傳給其所有鄰居。

5.3.2 LPARecer類
Rece過程對value值進行識別,識別可以通過Map過程把預先定義好的特殊字元如『#』、『@』來實現前綴到value上來實現。由於人物關系圖中的各個邊都是有權重的,並且代表兩個人物的相關程度,所以標簽更新過程不是用邊數最多的標簽而是權重最大標簽來更新,我們可以預先把權重最大的若干個保存到一個鏈表中,如果存在多個權重相同的標簽,則隨機選取一個作為該人名新的標簽。非同步方法更新標簽需要使用一個哈希表來存儲已經更新標簽的人物名和它們的新標簽,並且在更新標簽時使用該哈希表裡面的標簽。同步方法更新標簽則不需要存儲已更新的標簽。

Driver類

6.1 可視化工具Gephi
Gephi是一款開源的跨平台的基於JVM的復雜網路分析軟體。把PageRank和LPA的結果,轉化為gexf格式,在Gephi中繪制圖像並分析大數據實驗結果,更加直觀、易於理解。
gexf實際上是一種特殊的XML文件,python的gexf庫提供了介面方便我們編輯和生成gexf文件,因此我們選擇使用python處理PageRank和LPA的結果。頂點有兩種屬性,LPA生成的標簽和PageRank計算的PR值,每條邊的權重是PageRank計算出的值。在可視化的時候,標簽決定頂點顯示的顏色,PR值決定標簽的
6.2 可視化預處理
編寫一個python程序transform2xml.py,將數據分析部分得到的PR值,標簽以及點連接關系處理成一個可供Gephi讀取的gexf文件。
6.3 可視化結果

7 輸出結果截圖

7.2 同現次數統計

7.4 PageRank

3. 鄰接表 判斷有向圖是否有環 python

鄰接表還是逆鄰接表看如果是逆鄰接表,每個頂點出發鄰接表的鏈表中的結點個數就是入度
如果是鄰接表過程如下:
有一個輔助數組,大小就是頂點數量,所有元素初值都為0
從頭到尾遍歷每個頂點出發的鄰接表的結點,只要當前結點的數據是幾(也就是第幾個結點被有向弧進入了),這個下標的輔助數組元素加1,等所有的鄰接表的小鏈表遍歷完了,這個輔助數組中各個下標的數字就是該頂點的入度

4. python版解:用p指針掃描結點,根據p. data值將該結點插入到3個單鏈表L、L1和L2

P=L 把L指向地址百付給PP和L同時執行同內存地址

p=p->next p移了L鏈下地址指向了L下元素地址

L->next=NULL L值只空指針地址

00

建立二叉搜索樹並查找父結點

求單鏈表的長度度

指針數組的每個元素都是一個指針變數

靜態鏈表和動態鏈表的區別

數據結構問創建單鏈表

鄰接表存儲圖的廣度優先遍歷

帶頭指針L的雙向循答環鏈表中,指針p指向雙向循環鏈表的尾版結點...

這樣應該有這樣的關系: 尾結點->頭結點。又因為鏈表是雙向的,所以頭結點應該有指向尾結點的指針,即:尾結點<-頭結點。如果P指向尾結點,則有權P->next == L,而L->p...

5. python graph怎麼看

圖結構(Graph)——演算法學中最強大的框架之一。樹結構只是圖的一種特殊情況。

如果我們可將自己的工作詮釋成一個圖問題的話,那麼該問題至少已經碰判接近解決方案了。而我們我們的問題實例可以用樹結構(tree)來詮釋,那麼我們基本上已經擁有了一個真正有效的解決方案了。

鄰接表及加權鄰接字典

對於圖結構的實現來說,最直觀的方式之一就是使用鄰接列表。基本上就是針對每個節點設置一個鄰接列表。下面我們來實現一個最簡單的:假設我們現有 n 個節點,編號分別為 0, …, n-1.

節點當然可以是任何對象,可被賦予任何標簽或名稱。但使用 0, …, n-1 區間內的整數來實現的話,會簡單許多。因為如果我們能用數字來代表節點,我們索引起來顯然要方便許多。

然後,每個鄰接(鄰居)列表都只是一個數字列表,我們可以將它們編入一個大小為 n 的主列表,並用節點編號對其進行索引。由於這些列表內的節點的順序是任意的,所以,實際上,我們是使用列表來實現鄰接集(adjacency sets)。這里之所以還是使用列表這個術語,主要是因為傳統。幸運的是,Python 本身就提供獨立的 set 類型。

我們以下圖為例,說明圖結構的各種表示方笑凳改法(當我們在執行與圖相關的工作時,粗孝需要反復遵從一個主題思想,即一個圖的最佳表示方法應該取決於我們要用它來做什麼):



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}]1234567891011

在圖論中,N(v)代表的是v的鄰居節點集;

>>> b in N[a] # neighborhood membershipTrue>>> len(N[f]) # out-degree:出度31234

加權鄰接字典

使用dict類型來代替set或list來表示鄰接集。在 dict 類型中,每個鄰居節點都會有一個鍵和一個額外的值,用於表示與其鄰居節點(或出邊)之間的關聯性,如邊的權重。

a, b, c, d, e, f, g, h = range(8)
N = [

{b:2, c:1, d:3, e:9, f:4},
{c:4, e:4},
{d:8},
{e:7},
{f:5},
{c:2, g:2, h:2},
{f:1, h:6},
{f:9, g:8}
]123456789101112

客戶端調用:

>>> b in N[a] # neighborhood membership
True
>>> len(N[f]) # out-degree
3
>>> N[a][b] # Edge weight for (a, b)
2123456

鄰接矩陣

鄰接矩陣是圖的另一種表示方法,這種表示方法的主要不同在於,它不再列出每個節點的所有鄰居節點。

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],
]12345678910111213

關於鄰接矩陣:

  • (1)主對角線為自己到自己,為0

  • (2)行和為出度

  • (3)列和為入度

6. 計算機專業都學什麼呢

計算機專業類包括計算機科學與技術、軟體工程、網路工程、信息安全等七八個專業。
計算機專業學習的課程主要有大數據技術導論、數據採集與處理實踐(Python)、Web前/後端開發、統計與數據分析、機器學習、高級資料庫系統、數據可視化、雲計算技術、人工智慧、自然語言處理、
媒體大數據案例分析、網路空間安全、計算機網路、數據結構、軟體工程、操作系統等,以及大數據方向系列實驗,並完成程序設計帆棚、數據分析、機器學習、數據可視隱轎芹化、灶畢大數據綜合應用實踐、專業實訓和畢業設計等多種實踐環節。

7. arcgis利用 python設置高程顏色

1、四色填充演算法—回溯法。
2、ArcGIS生成鄰接表。
3、基於Python編寫工具計算每個省份的顏色。
4、在ArcGIS中添加腳本工具。
5、運行腳本工具。
6、以上就是arcgis利用python設置高程顏色的方法。

8. 非遞歸演算法,以孩子兄弟為存儲結構的計算樹的深度 這個程序什麼意思 該怎麼理解

首先樹的兒子會有很多的,為了解決兒子很多且不定的情況:
也採用二叉樹的存儲結構類型,但做了一點改進:
左節點vp表示大兒子,右節點hp表示兄弟,這樣「樹」就變成「二叉樹」
的結構了。 右節點串在一起,表示同一層。
另要搞懂隊列,是數組做的循環隊列qu[ ], 頭front ,尾rear;
又增加一個數組 level [ ]是隊列qu[ ]的輔助單元, 存放 隊列節點的層號,兩數組
下標是一一對應的;
這兩個概念是基礎,一定要懂。不懂是看不下去的。
演算法的核心:
1. 用隊列的方法遍歷所有節點,從隊列中取出一個節點指針進行訪問,同時
取出層號,並把這個節點的所有子節點及它的層號放入隊列鎮芹,以便以後取出訪問;
為了啟動遍歷,初始隊列須壓入根節點;
2. 遍歷時知道這個節點層號(m),御衫畢就可比較,最大值(max)就是樹的深度。
3. 遍歷訪問一個節點時,左節點vp就是大兒子,屬下一層,層號是m+!,
右節點開始就是同層兄弟(第二個while就是),須壓入隊列,層號仍是m+1;
4. 反復循環取出隊列中節點進行訪問(直到為空),並把它的把有兒子塌友壓入隊列
以便再次訪問;

這個經典演算法,不復雜, 有不明白的再追問

9. 用python實現鄰接矩陣轉換為鄰接表,python語言實現

graph
=
{'A':
['B',
'C'],
'B':
['C',
'D'],
'C':
['D'],
'D':
['C','G','H'],
'E':
['F'],
'F':
['C']}
#從圖中找出任意一條從起始頂點到終止頂點的路徑
def
find_path(graph,
start,
end,
path=[]):
if
start
==
end:
print
"path",
path
return
True
if
not
graph.get(start):
path.pop()
return
False
for
v
in
graph[start]:
if
v
not
in
path:
path.append(v)
if
find_path(graph,v,end,path):
return
True
return
False
path
=
[]
if
find_path(graph,
'A',
'C',
path=path):
print(path)
else:
print(1)
#從圖中找出從起始頂點到終止頂點的所有路徑
import

def
find_path_all(curr,
end,
path):
'''
:param
curr:
當前頂點
:param
end:
要到達的頂點
:param
path:
當前頂點的一條父路徑
:return:
'''
if
curr
==
end:
path_tmp
=
.deep(path)
path_all.append(path_tmp)
return
if
not
graph.get(curr):
return
for
v
in
graph[curr]:
#一個頂點在當前遞歸凱旦肆路徑中只能出現一次,否則會陷入死循環。
if
v
in
path:
print("v
%s
in
path
%s"
%(v,
path))
continue
#構造遲神下次遞歸的父路徑
path.append(v)
find_path_all(v,end,path)
path.pop()
path_all
=
[]
find_path_all('A',
'G',path=['A'])
print
path_all
#遍歷圖中所有頂點,按照遍歷順序將頂點添加盯轎到列表中
vertex
=
[]
def
dfs(v):
if
v
not
in
graph:
return
for
vv
in
graph[v]:
if
vv
not
in
vertex:
vertex.append(vv)
dfs(vv)
for
v
in
graph:
if
v
not
in
vertex:
vertex.append(v)
dfs(v)
print(vertex)

10. 簡介圖論演算法

圖論101

圖論是數學的一個非常廣泛哪譽的分支,非常適用於現實世界中的問題。 最初,圖論是"發明"來解決現實問題的,此後,它像所有其他數學分支一樣,被抽象數學家所劫持。

在本教程和後續教程中,我們將介紹一些圖論演算法及其在Python中的實現。 現在,回到主題。

簡而言之,圖是一組頂點/節點和邊。 如果您對" set"不滿意,請用collection代替。

在上圖中,頂點/節點將是人物。

頂點是圖的基本單位。 它幾乎可以代表任何實體,通常以圓圈表示。

在上圖中,連接襲緩陪人的線是邊。

頂點之間的線或連接稱為邊。 它可以表示頂點之間的任何類型的關系。

邊上具有方向的圖稱為有向圖。 它可以用來顯示與前輩(從父母到孩子的箭頭)或祖先(從孩子到父母的箭頭)的關系。

邊上沒有方向的邊的圖稱為無向圖。 它可用於顯示雙向道路。

邊上帶有數字的圖形,代表交易成本,旅途公平,城市之間的距離等。它可以具有任何類型的邊。

沒有循環的無向圖是一棵樹。 在這里,循環意味著只有一種方法可以通過跟隨給定其他節點的邊緣來到達節點。

一棵樹的所有節點都通過一條邊連接到其他某個節點,並且有N個節點的N-1個邊。

表示圖形的方法有很多,最常見的兩種是:

假設圖中有N個節點。 我們可以使用具有N行和N列的矩陣來表示它,其中該矩陣的行和列將代表一個節點,並且其中的條目代表有向邊(有或沒有權重)。

它們形成代錶行的節點到代表列的節點。 通常,0或無窮大用於表示節點之間沒有邊緣。 在Python中,鄰接矩陣可以表示為:

類似地,對於拍蠢N個節點的圖,我們可以使用鄰接表來表示該圖,其中節點的所有邊都保留在元組列表(節點,權重)中。 在python中,它可以表示為:

我使用嵌套字典(這就是我所說的)和帶集合的字典(如果節點沒有權重的邊)來表示圖。

在下一篇文章中,我將使用不同的方法發布精心設計的圖類的Python代碼,我們將使用該代碼來實現圖演算法。

(本文翻譯自sleepingFish的文章《Graph Theory Algorithms "Simplified"》,參考:https://medium.com/better-programming/graph-theory-algorithms-simplified-9a6868cc222)

熱點內容
androidcursor遍歷 發布:2024-11-02 00:27:40 瀏覽:767
網易我的世界地皮伺服器大全 發布:2024-11-02 00:24:20 瀏覽:964
光宇國際服怎麼安卓轉ios 發布:2024-11-02 00:14:23 瀏覽:170
魔獸世界單機資料庫 發布:2024-11-01 23:37:11 瀏覽:698
配置vlan後如何配置電腦ip 發布:2024-11-01 23:21:16 瀏覽:546
中鐵盾構機密碼是多少 發布:2024-11-01 23:07:21 瀏覽:708
工規存儲 發布:2024-11-01 22:59:33 瀏覽:802
無法識別加密狗 發布:2024-11-01 22:47:03 瀏覽:599
手機怎麼給wifi改密碼怎麼辦啊 發布:2024-11-01 22:46:03 瀏覽:858
抖音賬號的密碼是由什麼組成 發布:2024-11-01 22:45:27 瀏覽:449