簡體   English   中英

二維陣列的深度優先搜索

[英]depth first search with 2D Array

我有一個像這樣的數組:

0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 1 0 0 0 0
0 1 1 1 1 0 0 1 0 1 0
0 1 1 0 1 0 0 0 0 1 1
0 0 0 1 1 0 0 0 1 1 0
0 0 0 0 0 0 0 0 0 0 0

我想將元素分組為“ 1”。

所以您看到我通過使用堆棧獲得了經典的dfs。 問題是,如果我具有上述矩陣,該算法的時間復雜度是多少,其中n是矩陣元素的數量。 (行*列)如果比O(N)差(因為我必須遍歷整個2D數組),哪種方法將有助於我改進此算法?

O(n * log n)算法的示例

(其中n是矩陣元素的數量)

該算法的思想如下。

  1. 通過將所有矩陣元素添加到樹中來初始化未處理元素U的樹集
  2. U尚未為空時,從U中取出任何u並檢查其值
    • 如果u ='0',則將其刪除,即U := U \\ {u}
    • 如果u ='1',則開始探索DFS(u,U)


其中過程DFS(u,U)使用矩陣探索u的'1'鄰居。

但是,需要注意的是, DFS(u,U)也會從U中刪除所有發現的元素。


很容易理解並證明該算法確實總是以O(n * log n)完成。 從樹集中刪除元素具有最壞情況的復雜度O(log n)。 每個DFS(u,U)運行最多可以訪問| U |。 元素,並且隨着執行的進行,從U中刪除通過任何方式訪問的每個元素。 U變空時,算法終止。

簡短的摘要

例如,不管您先前獲得的知識如何,都可以通過在每個元素上運行DFS來生成O(n ^ 2)算法。 使用任何機制確保不在已發現的組/島上運行DFS可能會產生更好的算法。

抱歉,我無法直接分析您自己的算法,但這可能會幫助您自己進行操作。

您需要設計的算法的下限應該是O(m+n) -我正在考慮將行數和列n分別設置為mn 這是因為無論如何您都需要遍歷整個2D數組。 如果使用兩個for循環解決此問題,則也將花費O(m+n) 對於矩陣中的每個元素,您都將與其他四個相鄰元素進行比較,因此,總體檢查大小為<= 4mn

我認為沒有比O(m+n)時間更好的方法來解決這個問題了。

請注意,在您的問題中,如果您考慮m+n = N那么我指的復雜度是O(N)

暫無
暫無

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

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