簡體   English   中英

有效的圖遍歷算法

[英]Algorithm for efficient graph traversal

我正在搜索以下用例的算法或算法思想:

有向圖由多個頂點組成。 其中一些頂點帶有一個值(如數字)注釋,並且沒有父頂點(前身)。 所有其他頂點都表示操作。 僅當已知所有父頂點(前身)的注釋值時,才能執行操作。 然后將運算的結果或值存儲在頂點中。

我的解決辦法:

  1. 將一組至少具有一個父頂點(前任頂點)的所有頂點存儲
  2. 當集合不為空時:
    1. 從集合中獲取下一個頂點
    2. 檢查所有父頂點(前身)的值是否已知
    3. 如果所有值均已知:
      1. 從集合中刪除頂點
      2. 執行操作
      3. 將運算結果存儲在頂點中
      4. 循環播放(轉到2。)
    4. 否則:循環播放(轉到2。)

我的問題:我認為此解決方案可行,但效率不高(特別是對於大型圖形結構)。

是否有解決此問題的更有效方法?

有一些避免避免漫無目的地重新檢查頂點的可能性,例如:

  1. 初始化一個整數數組,該整數數組為每個頂點存儲父級數。
  2. 初始化一組具有0個父對象的頂點(可以與步驟1同時進行)。
  3. 在該集合為空之前:
    1. 從該集合中獲取一些頂點a並對其進行處理。
    2. 從每邊a到頂點b ,遞減頂點的父計數b 如果計數達到0,則將b添加到准備處理的頂點集中。

要做的事情稱為“拓撲排序”-按照處理頂點的順序,每個節點的先驅必須先於其出現: https : //en.wikipedia.org/wiki/Topological_sorting

有幾種有效的算法。 一個非常接近您的頂點,但是只有在沒有未完成的前任頂點的情況下才將頂點放在集合中。 (哈羅德的答案)

這本質上不是一個水平順序遍歷的問題嗎?

鑒於,

僅當已知所有父頂點(前身)的注釋值時,才能執行操作。

您應該從沒有父頂點的頂點開始。 (這部分已經由您確定。)

接下來,不要將它們放在一組中,而是將它們放在隊列中,這樣先進先出的基礎實際上允許您按級別順序處理每個頂點。

如果無法計算當前頂點的值,則將其放回隊列,否則將當前頂點可到達的頂點放到隊列中。 保持具有所需父頂點值可用的頂點的計算值。

我幾乎可以說,通過一些優化,這將是最有效的方法。

暫無
暫無

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

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