目錄
簡介
圖的陣列表示
圖建置條件
給定條件的解釋
驗證圖建構的條件
#DFS 和 BFS 演算法
虛擬程式碼
複雜性
逐步循環偵測過程
結論
首頁 Java java教程 檢查根據給定條件從數組建立的圖是否包含循環

檢查根據給定條件從數組建立的圖是否包含循環

Aug 31, 2023 pm 06:57 PM
檢查循環(check cycle) 數組建構(array construction) 給定條件(given conditions)

簡介

在圖論中,弄清楚由陣列建立並滿足某些條件的圖是否有環是一項非常重要的任務。圖表是一種顯示事物如何連結在一起的想像方式。它被用在很多地方,例如電腦網路和社交網路。本文討論了圖構造的條件、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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1664
14
CakePHP 教程
1422
52
Laravel 教程
1316
25
PHP教程
1267
29
C# 教程
1239
24
公司安全軟件導致應用無法運行?如何排查和解決? 公司安全軟件導致應用無法運行?如何排查和解決? Apr 19, 2025 pm 04:51 PM

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

如何將姓名轉換為數字以實現排序並保持群組中的一致性? 如何將姓名轉換為數字以實現排序並保持群組中的一致性? Apr 19, 2025 pm 11:30 PM

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

如何使用MapStruct簡化系統對接中的字段映射問題? 如何使用MapStruct簡化系統對接中的字段映射問題? Apr 19, 2025 pm 06:21 PM

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本啟動Spring...

如何優雅地獲取實體類變量名構建數據庫查詢條件? 如何優雅地獲取實體類變量名構建數據庫查詢條件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

Java對像如何安全地轉換為數組? Java對像如何安全地轉換為數組? Apr 19, 2025 pm 11:33 PM

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

如何利用Redis緩存方案高效實現產品排行榜列表的需求? 如何利用Redis緩存方案高效實現產品排行榜列表的需求? Apr 19, 2025 pm 11:36 PM

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? 電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? Apr 19, 2025 pm 11:27 PM

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

See all articles