簡體   English   中英

O(n + m)中的DFS和BFS是否會發生變化?

[英]does DFS and BFS in O(n+m) change?

我們知道有一個O(n+m)‌溶液(DFS或BFS),用於檢查是否存在從路徑st在無向圖Gn頂點和m邊緣...這將經由鄰接來實現名單。

如果我使用Adjacency Matrix實現程序,運行時間會受到影響嗎? 這是好選擇還是壞選擇?

編輯:我需要計算時間復雜度,這樣,有什么想法嗎?

假設您的代碼輸入為nm (節點數和邊數),后跟m條類型為ab線,表示頂點a和頂點b之間存在一條邊。 現在,采用鄰接矩陣M[][] ,如果ij之間存在邊,則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可能只是大型算法的一部分,您的算法可能還需要告知節點ab之間是否存在一條邊緣,鄰接矩陣在該邊緣處花費O(1)時間。 因此,選擇鄰接表還是鄰接矩陣確實取決於您的算法(例如您可以占用的最大內存,DFS / BFS例程之類的時間復雜性或是否回答是否連接了兩個頂點等)。 希望我回答了您的查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM