簡體   English   中英

JAVA Graph / DFS實現

[英]JAVA Graph/DFS implementation

我有一個小小的困境,我想建議 -

我正在實現一個圖形(定向),我想讓它更通用 - 即Graph,其中T是節點(頂點)中的數據。 要向圖表添加頂點,請添加(T t)。 該圖形將T包裹到一個將T保持在內部的頂點。

接下來我想在圖上運行DFS - 現在這就是我的困境 - 我應該在頂點(作為成員)保留“訪問”標記還是在運行DFS(頂點 - >狀態圖)時啟動一些地圖?

保持它在頂點不太通用(頂點不應該熟悉DFS算法和實現)。 但是創建地圖(頂點 - >狀態)非常耗費空間。

你怎么看?

非常感謝!

如果您需要運行算法,尤其是更復雜的算法,您將很快發現必須將所有類型的數據與頂點相關聯。 使用圖形項存儲數據的通用方法是一個好主意,當然,讀取和寫入數據的訪問時間應該是O(1),理想情況下。 簡單的實現可能是使用HashMap,它對大多數情況都有O(1)訪問時間,但因子相對較高。

對於yFiles Graph Drawing Library,他們添加了一種機制,其中數據實際存儲在元素本身,但您可以根據需要分配盡可能多的數據槽。 這類似於使用每個元素管理Object[]並將索引作為“map”使用數據數組。 如果您的圖形沒有改變,另一種策略是使用元素本身(只是整數)存儲圖形中元素的索引,然后使用該索引索引到數組中,對於每個“數據映射”,您基本上具有一個數組元素數量的大小。 這兩種技術都可以很好地擴展並提供最佳的訪問時間,除非您的數據非常稀疏(實際上只需要存儲數據的一小部分元素)。

“元素Object[] ”方法:

  • 在您的頂點和邊類中,添加一個Object[]類型的字段,它是包私有的。
  • 實現一個Map接口,提供T getData(Vertex)void setData(Vertex, T
  • 該接口的一個實現可以由HashMap<Vertex,T>但我建議的實際上只存儲一個整數index ,用於索引頂點的Object[]數組。
  • 在你的graph類中添加一個方法createMap ,它跟蹤used和free索引並創建上面類的新實例,其getter和setter實現使用Vertex類的包private字段來實際訪問數據

“One Array”方法:

  • 將包私有整數字段添加到Vertex類
  • 保持整數字段與圖表中頂點的順序同步 - 第一個Vertex的索引為0 ,等等。
  • 在替代地圖實現中,您最初分配一個具有頂點數量大小的T[]
  • 在getter和setter實現中,您獲取Vertex的索引並使用它來訪問數組中的值。

對於DFS算法,我會選擇“一個數組” - 方法,因為你可以使用一個byte [](或者如果“訪問”只需要你甚至可以使用BitSet )來提高空間效率,你可能會填充如果圖表已連接,則DFS中所有頂點的數據。 這應該比基於HashMap的方法執行得更好,並且不需要裝箱和拆箱來將數據存儲在Object[]

暫無
暫無

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

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