簡體   English   中英

設計PRIM算法最有效的數據結構是什么?

[英]What is the most efficient data structure for designing a PRIM algorithm?

我正在使用哈希表為其元素設計c ++中的圖形。 哈希表使用開放式尋址,並且圖的邊數不超過50.000。 我還設計了一種PRIM算法來查找圖形的最小生成樹。 我的PRIM算法為以下數據創建存儲:

  • 一個名為Q的表,將所有節點放在開始位置。 在每個循環中,都會訪問一個節點,並在循環結束時將其從Q中刪除。

  • 一個名為Key的表,每個節點一個。 必要時可以更改密鑰(每個循環至少更改一次)。

  • 一個名為Parent的表,每個節點一個。 在每個循環中,都會在此表中插入一個新元素。

  • 名為A的表。 程序在此處存儲最小生成樹的最終邊緣。 這是返回的表。

假設圖形有50.000條邊,那么用於創建這些表的最有效的數據結構是什么?

我可以使用數組嗎?

我擔心每個數組的元素都太多了。 我什至不考慮使用鏈表,因為訪問每個元素將花費很多時間。 我可以使用哈希表嗎?

但是同樣,要素是通往許多要素的途徑。 我的算法對於包含幾個節點(10個或20個)的圖效果很好,但我對圖包含40.000個節點的情況表示懷疑。 任何建議深表感謝。

(由於評論的時間過長):對於非常大的尺寸,問題的唯一一部分似乎很難看,這是每個尚未選擇的節點都有成本,並且您需要在每個步驟中找到成本最低的節點,但是執行每個步驟會減少一些有效隨機節點的成本。

當您要跟蹤最低成本時,優先級隊列是完美的選擇。 刪除成本最低的節點(在每個步驟中執行此操作)非常有效。 就像在任何步驟中一樣,添加一些新的可訪問節點非常有效。 但是在基本設計中,它無法降低已經可以以高成本實現的幾個節點的成本。

因此(經常需要功能更多的優先級隊列),我通常創建一個指向對象的指針堆,並且在每個對象中都有其堆位置的索引。 堆方法都會對對象進行回調,以在其索引更改時通知它。 堆還對方法進行了一些外部調用,這些方法通常只能是內部調用,例如,當現有元素的成本降低時,最適合有效修復堆的方法。

我剛剛查看了標准品的文檔
http://en.cppreference.com/w/cpp/container/priority_queue
看看我一直想添加的功能是否以我以前從未注意到的某種形式存在(或已經在某些最新的C ++版本中添加)。 據我所知, 現實世界中大多數使用優先級隊列(可能是我的所有隊列)都需要一些次要的附加功能,我不知道該如何使用標准版本。 因此,我需要從頭開始重寫它,包括其他功能。 但這實際上並不難。

我使用的方法已經被很多人重新發明了(我在70年代用C語言做的,但不是第一次)。 快速的Google搜索發現,我所描述的方法比我所描述的更詳細。 http://users.encs.concordia.ca/~chvatal/notes/pq.html#heap

暫無
暫無

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

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