[英]does DFS and BFS in O(n+m) change?
我們知道有一個O(n+m)
溶液(DFS或BFS),用於檢查是否存在從路徑s
到t
在無向圖G
與n
頂點和m
邊緣...這將經由鄰接來實現名單。
如果我使用Adjacency Matrix實現程序,運行時間會受到影響嗎? 這是好選擇還是壞選擇?
編輯:我需要計算時間復雜度,這樣,有什么想法嗎?
假設您的代碼輸入為n
和m
(節點數和邊數),后跟m
條類型為ab
線,表示頂點a
和頂點b
之間存在一條邊。 現在,采用鄰接矩陣M[][]
,如果i
和j
之間存在邊,則M[i][j]=1
,否則M[i][j]=0
(因為圖是無向的,矩陣將是對稱,因此您只能存儲上/下半矩陣以減少一半的內存)。 現在,您必須獲取矩陣並將其初始化為0(所有單元格),並且在掃描邊緣標記M[a][b]=M[b][a]=1
。 現在初始化部分是O(n^2)
。 掃描和標記邊緣為O(m)
。 現在讓我們看一下BFS / DFS例程。 在節點上時,您嘗試查看其所有未訪問的頂點。 現在說我們想知道頂點a
的鄰居, for(int i=0;i<n;i++) if (M[a][i]==1)
(假設基於0的索引),則必須要做for(int i=0;i<n;i++) if (M[a][i]==1)
)。 現在必須對每個頂點執行此操作,因此即使m < (n*(n-1))/2
(假設沒有多個邊和循環的簡單圖形m
都可以在m
處執行O(n^2)
,例程的復雜度也變為O(n^2)
最大值為(n*(n-1))/2
)。 因此,總體而言,您的復雜度變為O(n^2)
。 那么,鄰接矩陣的用途是什么? 好吧,DFS / BFS可能只是大型算法的一部分,您的算法可能還需要告知節點a
和b
之間是否存在一條邊緣,鄰接矩陣在該邊緣處花費O(1)
時間。 因此,選擇鄰接表還是鄰接矩陣確實取決於您的算法(例如您可以占用的最大內存,DFS / BFS例程之類的時間復雜性或是否回答是否連接了兩個頂點等)。 希望我回答了您的查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.