图导航问题

时间:2010-04-29 10:24:43

标签: algorithm graph

我有一个组件图和它们之间的关系。用户使用根组件开始导航。他单击组件上的展开按钮以显示与当前组件相关的新组件。

问题是当用户决定折叠节点时。我必须选择一个子树来隐藏,同时让图形保持一致状态,这样就没有与图中另一个节点缺少关系的扩展节点。

现在,在组件之间存在循环/循环的情况下,我很难选择子树。为简单起见,我选择扩展的顺序。因此,如果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[+]

所以,我知道如何才能解决这个问题。用户需要浏览图形并且应该能够崩溃,但我遇到了循环节点的问题,在这种情况下,如果崩溃,任何循环节点都会使图形处于不一致状态。

4 个答案:

答案 0 :(得分:1)

如果子节点知道有多少父母链接到它,那么当只有一个父节点连接时,您可以让子节点仅自行折叠。

推断你的例子

  • 折叠B会要求节点D崩溃。
  • 节点D不会崩溃,因为它有两个父母
  • B删除指向D的链接(只留下一个父亲的D)
  • 如果现在节点C要求D折叠,它将自行折叠。

答案 1 :(得分:0)

我认为关闭B应该只关闭B.

由于A是主A不应该被关闭,而且从D也导致A超过C,所以D也保持打开状态。

可能是一个实现 每个链接都应该告诉你掌握链接,告诉你是否可以达到这个方向的主人醒来(我想你把图表存储为双向链表)。或者你每次申请子图结束时都要这个规则。

答案 2 :(得分:0)

我认为您的问题的答案取决于图表的用途。任何子图都可能被折叠,您只需用新节点替换该子图,连接到子图的每条边重新连接到新节点。在这种情况下,图表永远不会不一致。

真正的问题是“崩溃”是什么意思。什么操作是自然的,完全取决于图表的用途。

答案 3 :(得分:0)

很有趣,我在应用程序域中遇到了完全不相关的情况(以及循环引用的问题)。

我实施的解决方案非常简单,但实现它需要花费一些时间。有两个问题:

  • 你不想变得不一致
  • 你不想无限循环

我认为这可以很容易地在这里实现,因为你们关系的定位所以第二个问题不应该打扰我们:

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是用于边缘和节点的图形方法。