我有一个组件图和它们之间的关系。用户使用根组件开始导航。他单击组件上的展开按钮以显示与当前组件相关的新组件。
问题是当用户决定折叠节点时。我必须选择一个子树来隐藏,同时让图形保持一致状态,这样就没有与图中另一个节点缺少关系的扩展节点。
现在,在组件之间存在循环/循环的情况下,我很难选择子树。为简单起见,我选择扩展的顺序。因此,如果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 :(得分:1)
如果子节点知道有多少父母链接到它,那么当只有一个父节点连接时,您可以让子节点仅自行折叠。
推断你的例子
答案 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)
其中Display
和Hide
是用于边缘和节点的图形方法。