Algorithm 图形导航问题

Algorithm 图形导航问题,algorithm,graph,Algorithm,Graph,我有一个组件和它们之间关系的图表。用户使用根组件启动导航。他单击组件上的展开按钮以显示与当前组件相关的新组件 问题是当用户决定折叠节点时。我必须选择一个子树来隐藏,同时保持图处于一致状态,这样就不会有扩展节点丢失与图中另一个节点的关系 现在在组件之间循环/循环的情况下,我很难选择子树。为了简单起见,我选择了它们展开的顺序。因此,如果a展开为B和C,则折叠a将隐藏其创建的节点和边。现在考虑下面的场景。 [-]表示扩展状态,[+]表示尚未扩展。A被展开以显示B和C。然后B被展开以显示D。C被展开,这

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

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

现在在组件之间循环/循环的情况下,我很难选择子树。为了简单起见,我选择了它们展开的顺序。因此,如果a展开为B和C,则折叠a将隐藏其创建的节点和边。现在考虑下面的场景。

[-]表示扩展状态,[+]表示尚未扩展。A被展开以显示B和C。然后B被展开以显示D。C被展开,这在C和退出的节点D之间创建了一个链接,也创建了节点E。现在用户决定折叠B。由于按展开顺序D是B的子级,它将折叠并隐藏D。这将使图处于不一致的状态,因为C对D有边,但如果i删除CD边缘,它仍将不一致。如果我折叠C,E又是一个循环链接,例如到a,将产生相同的问题

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

伙计们,你们知道我该怎么解决这个问题吗。用户需要在图形中导航,应该能够折叠,但我遇到了循环节点的问题,在这种情况下,如果折叠,循环中的任何节点都会使图形处于不一致的状态。

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

因为A是主A不应该被关闭,从D它也会导致A超过C,所以D也保持打开状态

一种实现可能是
每个链接都应该告诉你们主控链接,主控链接告诉你们在这个方向上是否可以到达主控点(我想你们把这个图存储为双链表)。或者,每次应用子图闭包时,您都会勾选此规则。

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


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

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

根据你的例子推断

  • 折叠B将要求节点D折叠
  • 节点D没有折叠,因为它有两个父节点
  • B删除到D的链接(只将D留给一个父级)
  • 如果现在节点C要求D折叠,它将自行折叠

有趣的是,我在一个完全无关的应用程序域中遇到了这种情况(以及循环引用的问题)

我实现的解决方案非常简单,但我花了一些时间才实现。有两个问题:

  • 你不想变得前后矛盾
  • 你不想无限期地循环
我认为这很容易实现,因为你们的关系是面向对象的,所以第二个问题不应该困扰我们:

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)

其中,
Display
Hide
是用于边和节点的图形方法。

@Matthieu M.对不起,我今天过得不好,我的反应不充分,尽管我在理解这个问题时确实遇到了问题。@affan请接受我的道歉,我不想粗鲁无礼。