檢查根據給定條件從數組建立的圖是否包含循環
簡介
在圖論中,弄清楚由陣列建立並滿足某些條件的圖是否有環是一項非常重要的任務。圖表是一種顯示事物如何連結在一起的想像方式。它被用在很多地方,例如電腦網路和社交網路。本文討論了圖構造的條件、BFS 和 DFS 演算法,並逐步指導如何識別無向圖中的循環。
圖的陣列表示
圖論中基於數組的方法將頂點和邊存儲在數組中,這使得它們易於在演算法中使用和使用。從空圖開始,根據數組中的信息一次添加一個頂點和邊,這是進一步探索的基礎,例如循環檢測,這對於理解圖如何連結以及是否存在循環非常重要。
圖建置條件
給定條件的解釋
圖是由陣列建構的,其中陣列表示一組頂點及其連接或邊。
陣列的每個元素對應圖中的一個頂點
#陣列中每個元素的值表示它所連接的頂點(其相鄰頂點)的索引。
陣列的索引代表頂點本身,其對應的值代表它所連接的頂點。
驗證圖建構的條件
在建立圖表之前檢查陣列是否有效並滿足所需條件。
確保陣列不為空並且至少包含一個元素來建立頂點。
驗證陣列是否只包含非負整數,因為負值或無效資料無法表示有效的頂點或邊
確保陣列索引在適當的範圍內。它們應該從 0 開始到 n-1,其中 n 是圖中的頂點總數。
確認數組中的值(連接)也在0到n-1的有效範圍內,確保它們對應於現有的頂點
#檢查是否有重複連接或自循環,因為它們違反了有效圖表的條件
驗證沒有遺失連接,這表示所有頂點都連接起來形成完整的圖或連接的元件
#DFS 和 BFS 演算法
深度優先搜尋 (DFS) 用於探索圖的頂點和邊,方法是在轉身之前盡可能深入每個分支
虛擬程式碼
procedure DFS(graph, start_vertex, visited) if start_vertex is not in visited: mark start_vertex as visited process start_vertex (e.g., check for cycles) for each neighbor in graph[start_vertex]: if neighbor is not in visited: DFS(graph, neighbor, visited) end if end procedure pocedure DFS_Traversal(graph) visited = empty set for each vertex in graph: if vertex is not in visited: DFS(graph, vertex, visited) end for end procedure
廣度優先搜尋 (BFS) 是一種圖遍歷演算法,一次一層地遍歷圖的所有頂點。這使得它成為在圖表中尋找週期的好方法
虛擬程式碼
procedure BFS(graph, start_vertex): create an empty queue Q create a set visited to keep track of visited vertices enqueue start_vertex into Q add start_vertex to visited set while Q is not empty: current_vertex = dequeue from Q for each neighbor_vertex of current_vertex: if neighbor_vertex is not in visited set: enqueue neighbor_vertex into Q add neighbor_vertex to visited set else: // A cycle is detected, return true return true // No cycle found, return false return false
複雜性
時間複雜度
空間複雜度
#BFS 和 DFS 的時間複雜度都是 O(V E),其中 V 是頂點數,E 是邊數。
#BFS 和 DFS 的時間複雜度為 O(V)。
逐步循環偵測過程
讓我們考慮一個帶有圖表的範例

從一個空集合開始監視造訪過的頂點
Visited set: {}
選擇任意頂點作為循環偵測過程的起點。我們選擇頂點 A。
Visited set: {A} Current Vertex: A
檢查目前頂點 (A) 的相鄰頂點。在本例中,A 的鄰居是 B 和 D。將它們新增至存取集中,並將 A 標識為其父節點
Visited set: {A, B, D} Current Vertex: A Parent of B: A Parent of D: A
B 是存取集中的下一個存取頂點。
Visited set: {A, B, D} Current Vertex: B Parent of B: A
探索 B 的周圍環境。 B 的直接鄰居是 A、C 和 E。 A 已經在存取頂點集合中,但它不是 B 的父節點,因此不構成環。
Visited set: {A, B, D, C, E} Current Vertex: B
繼續到下一個訪問的頂點,即 D。
Visited set: {A, B, D, C, E} Current Vertex: D Parent of D: A
發現 D 的熟人。 A 和 E 是 D 的最近鄰居。由於 A 已經包含在存取集中且是 D 的父代,因此必須有一條邊 (D -> A) 將 D 連接到其父代。這表示該圖包含一個循環。
Cycle detected! There is an edge (D -> A) forming a cycle
過程到這裡就結束了,我們已經使用BFS成功偵測到了圖中的環路 即(A->B->E->D->A)。
結論
總之,對於許多應用程式來說,能夠在根據給定參數從陣列建立的圖中找到循環非常重要。無論您使用 DFS 還是 BFS,此過程都有助於找到可能的循環並解決涉及網路、電路和關係的現實問題。有效的循環檢測可以提高演算法的速度並確保數據正確。
以上是檢查根據給定條件從數組建立的圖是否包含循環的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SublimeText3 Linux新版
SublimeText3 Linux最新版

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Dreamweaver CS6
視覺化網頁開發工具