2010-04-29 104 views
3

我有他們之間的組件和關係圖。用戶使用根組件開始導航。他單擊組件上的展開按鈕以顯示與當前組件相關的新組件。圖導航問題

問題在於用戶決定摺疊節點時。我必須選擇一個子樹來隱藏,同時使圖形保持一致的狀態,以便沒有展開的節點與圖中另一個節點的關係不存在。

現在如果組件之間出現循環/循環,我很難選擇子樹。爲了簡單起見,我選擇他們擴展的順序。因此,如果A展開到B和C展開,A將隱藏它創建的節點和邊緣。現在考慮下面的情況。

[ - ]表示展開狀態,[+]表示尚未展開。 A被展開以顯示B和C.然後B被展開以顯示D. C被展開,其在C和退出節點D之間創建鏈接並且還創建節點E.現在用戶決定摺疊B.由於通過展開順序D是B的孩子它會崩潰和隱藏D.這種離開圖的狀態不一致,因爲C對D具有邊緣,但D不再存在,如果我刪除CD邊緣,它仍然不一致。如果我摺疊C.而E又是一個循環鏈接,例如A會產生同樣的問題。

/-----B[-]-----\ 
A[-]    D[+] 
    \-----C[-]-----/ 
       \ 
       E[+] 

所以,大家任何想法我怎麼能解決這個問題。用戶需要瀏覽圖形,應該能夠崩潰,但我堅持循環節點的問題,在這種情況下任何節點在循環中如果崩潰都會使圖形處於不一致的狀態。

+0

@Matthieu M.對不起,我有糟糕的一天,我的反應是不夠的,雖然我真的有一個理解問題的問題。 – 2010-04-29 22:10:31

+0

@affan請接受我的道歉,我不想粗魯。 – 2010-04-29 22:11:23

+0

gabriel沒問題 – affan 2010-05-03 11:53:08

回答

1

如果一個孩子節點知道有多少父母被鏈接到它,你可以讓一個子節點只在連接一個父節點時才自行摺疊。

外推到你的例子

  • 摺疊B將要求節點d崩潰。
  • 節點d不垮,因爲它有兩個家長
  • 乙刪除鏈接到d(留下d只有一個父)
  • 如果現在節點C要求d崩潰,它就會崩潰本身。
0

我認爲關閉B應該只關閉B.因爲A是主人A不應該關閉,並且從D開始,它也會導致A在C之後,所以D也保持打開狀態。

一個實現可能是,每個鏈接都應該告訴你母版鏈接,告訴你是否可以在這個方向上達到主人醒來(我想你把圖存爲雙向鏈表)。或者您每次申請子圖關閉時都會觸發此規則。

0

我認爲你的問題的答案取決於圖的用途。任何subgraphp都可能被摺疊,只需用新節點替換該子圖,而每個連接到該子圖的邊與新節點重新連接。在這種情況下,圖表永遠不會不一致。

真正的問題是你的意思是「摺疊」。什麼操作是自然的,完全取決於圖表的用途。

0

有趣的是,我遇到了與應用程序領域完全無關的情況(和循環引用的問題)。

我實施的解決方案非常簡單,但我花了一些時間來實現它。有2個問題:

  • 你不想變得不一致
  • 你不想無限循環

我認爲它可以很容易地在這裏我認爲可以實現的,因爲你發生關係定向所以第二個問題,不應該打擾我們:

def Expand(node): 
    for c in node.childs: 
    c.parents.insert(node) 
    Display(node, c) 
    if len(c.parents) == 1: Display(c) 

def Collapse(node): 
    for c in node.childs: 
    del node in c.parents 
    Hide(node, c) 
    if len(c.parents) == 0: Collapse(c) 

    Hide(node) 

DisplayHide是用於邊緣圖形的方法和節點阿里柯。