2010-10-11 97 views
3

我正在考慮圖數據結構實現,並且正在查看「發生列表」表示。有它的一個簡短的描述在這裏:圖發生列表實現

Incidence list

所以每個頂點在圖中存儲這些邊後,它是事件的列表。

鑑於我的圖是一個有向圖,我不是從這個描述很清楚的一對夫婦點:

  1. 是否圖形本身還可以存儲所有邊緣的名單?
  2. 頂點只存儲傳出邊緣,還是傳入和傳出?
  3. 如果兩者都在單獨的列表中?

我很熟悉的其他圖形表示(鄰接表,鄰接矩陣,邊列表,關聯矩陣),所以這不是一個對一般的圖實現,只是這個特殊的一個問題。

任何指針將不勝感激。

回答

0

已經研究並想過這個問題進一步,我得出的結論是沒有發生率表圖形數據strucure。 我認爲維基百科的文章是作者腦海中一些混淆的產物。 感謝大家閱讀這個問題,並花時間在這個問題上。

阿爾芒

2

我知道我可能提高從死裏復活一個老問題,但我覺得它適合發表意見。

您可以使發病率表圖結構,你也可以調整它有向圖。

考慮一個LinkedList<Vertex>對象和LinkedList<Edge>對象。這可以讓你迭代所有的邊和所有的頂點,但不包含任何有關連接的信息。

說我們添加的話,幾個LinkedList<Connection>對象。實際上,每個Vertex。 A Connection就是EdgeVertex相符的地方。因此,一個Edge將有兩個Connection對象(對於無向圖),和一個Vertex將具有一個LinkedList<Connection>對象,表示到連接到它的每一個Edge連接。這本質上是一個發病名單。

您可以修改這表示有向圖,如果你刪除其中的一些Connection對象。更具體地說,你必須選擇哪裏沒有這些引用。您可以選擇從相關LinkedList<Connection>刪除Connection如果你不希望能夠看到一個EdgeVertex(上面的例子中,N2將有一個空LinkedList<Connection>)。你可能會轉而選擇使引用可選的Edge(對於上面的例子中,E1將不得不在N2一個Connection指向和一個Connection空,允許從E1遍歷N2,但未恢復到N1。您的選擇如何實現這完全取決於你,其中一個更直觀 - 邊緣是直接的,所以刪除邊緣上的連接來決定它們走哪條路似乎是合乎邏輯的。另一個看起來可能看起來更復雜一些,但會阻止你不必要地跳到無處不在的邊緣上,在進行廣度優先和深度優先搜索時無處可去。

以點形式:

  1. 在我的一個發名單的實現,我有。你需要爲你的實施?

  2. 嚴格地說,你可以通過只存儲傳出邊緣來獲得。但是,回溯算法可能會受益於能夠沿着他們旅行的參考回溯。當然,你可以用某種歷史來實現這一點,所以它可能不是一個考慮因素。

  3. 如果你們兩個都做,你可能需要一些方法來區分它是傳入還是傳出。無論是在頂點上有兩個LinkedList<Connection>對象,還是在Connection上有boolean pointingToVertex原語,或者其他什麼。也許你的Edge將被定向,並且無向邊將由兩個邊指向相反的方向。需要考慮的因素取決於你的結構的需求。

2

我通過以下方式實現的發病率列表,找不到任何問題的無向圖。我也實現了幾種圖形拓撲算法。

HashMap<VertexT, HashSet<EdgeT>> incidenceMap; 

使用集合的映射保證O(1)的頂點查找和分期O(1)複雜的邊緣插入和刪除。保持邊緣的發生列表而不是相鄰的頂點列表只是一種攜帶邊緣本身的某些特定信息的方法。例如,當您將權重與邊相關聯時,這對抽象算法也很有用。

編輯:

我已經更新了維基百科的talks爲「發病名單」主題。