Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在两个节点之间创建专用路径的算法_Algorithm_Math_Graph_Tree_Graph Algorithm - Fatal编程技术网

Algorithm 在两个节点之间创建专用路径的算法

Algorithm 在两个节点之间创建专用路径的算法,algorithm,math,graph,tree,graph-algorithm,Algorithm,Math,Graph,Tree,Graph Algorithm,我有一些文本,序列遵循特定的顺序。有些文字会因经过的痕迹而改变。我的目标是为每个页面生成静态页面,通过链接将它们互连 问题是解决一个工具的问题,该工具将为印刷书籍生成文本(显然是静态的)。因此,假设您正在阅读示例1(下图)中所示的一本书。最初,您位于节点A中,此页面的文本为“转到B页或C页”。选择节点C,然后选择F->B->E->H,您将在节点H中看到一个内容,该内容应该与您看到的是否被a->B->D->H遍历的内容不同,例如。因为这是一本印刷的书,我需要复制一些路径,以便能够根据遍历的路径更改

我有一些文本,序列遵循特定的顺序。有些文字会因经过的痕迹而改变。我的目标是为每个页面生成静态页面,通过链接将它们互连

问题是解决一个工具的问题,该工具将为印刷书籍生成文本(显然是静态的)。因此,假设您正在阅读示例1(下图)中所示的一本书。最初,您位于节点A中,此页面的文本为“转到B页或C页”。选择节点C,然后选择F->B->E->H,您将在节点H中看到一个内容,该内容应该与您看到的是否被a->B->D->H遍历的内容不同,例如。因为这是一本印刷的书,我需要复制一些路径,以便能够根据遍历的路径更改一些节点的内容

例如:

在本例中,我有两种遍历的可能性:

A -> B -> D
A -> C -> D
预期结果:

Page 1: A (link to page 2 and 3)
Page 2: B (link to page 4)
Page 3: C (link to page 5)
Page 4: D
Page 5: DD'
这个简单的示例生成5页,一旦第4页有一部分文本,无论阅读是否通过第3页,都应该只显示该部分文本

为了模拟这个问题,我选择使用图论。为了更好地理解,我在下图中画出了我试图解决的问题的两个示例:

请注意,红色虚线边实际上不是边。这是我用来表示给定节点X的内容在访问节点Y后发生变化的方式(读取“若到达X的路径经过Y,则节点X的内容发生变化”)

我读了很多关于图、遍历策略(BFS和DFS)和其他一些主题的书。我的目标是开发一种算法,以一种能够生成前面提到的页面的方式重新排列给定的图形。我没有发现任何解决这个问题的众所周知的问题,但我相信它应该已经存在了。我的研究没有发现任何有用的东西,所以我试着自己解决

我成功的方法是遍历图,找到一个包含依赖于其他节点的内容的节点。找到此节点后,将查找从从属节点到当前节点的所有路径。遍历这些路径复制包含多个传入边的所有节点,删除以前的连接并将当前节点与复制的连接,依此类推,直到使用路径的所有节点。这种算法工作得很好,但这种方法效率不高,而且在处理长文本时速度非常慢

我的问题是:你知道解决这个问题的其他更好的方法吗?有没有任何理论或已知算法可以解决这类问题


提前感谢。

执行DFS,当您看到已访问的节点时,复制该节点,断开刚访问的链接,将新节点标记为已访问,并从此节点继续DFS。此方法不会多次访问节点,因此是最快的(这意味着它只访问H1 2次,而不是n次或k次)


就输出图而言,这是线性的。也就是说,如果输出图有V'顶点和E'边,则其顺序为O(V'+E')。您不可能取得更好的效果,因为您必须至少访问一次输出图中的所有内容。

我假设这些红边的规则是静态的。在一个节点中保留多个内容,而不是复制它。现在,由于显示的内容取决于到达它的路径,因此在每个步骤中,我们都可以检查DFS的“堆栈”以查看到达它的路径。堆栈将为我们提供到达它的确切路径(但请注意,它不会提供路径是否访问了父级的其他中心的详细信息)。然后,我们比较已有的静态规则并显示内容

时间复杂度分析(最坏情况): 在DFS的每个步骤中,我们都会根据规则检查整个堆栈。堆栈的最大长度可以是h(其中h是树的高度)。因此,时间复杂度为O((V+E)*h)


或者,如果path访问了父级事务的其他中心(如分析路径A->B->E,如果已经访问了D),则可以根据规则在数据结构上自己引入红色边。同样,在一个节点中保留多个内容。在决定显示哪些内容时,只需检查“源自此垂直的红边”的“端点”是否已被访问。现在使用规则来显示适当的内容

只需确保DFS及其实现对您来说非常清楚,这将是显而易见的答案,但我不需要在所有情况下都进行复制,仅当我有一个节点,其内容在经过特定节点后发生变化时(请注意红边,表示“访问依赖关系”). 我的目标是在降低成本后复制尽可能少的页面。例如:我在H节点中有一个文本片段,如果访问了节点E和/或F,我就应该显示它。为了实现这一点,我需要在E->H和F->H之间创建一条专用路径。例如,当我访问E节点时,我将开始遍历一条路径,该路径将显示不同于我通过D节点时看到的内容,例如,如果节点已经“访问”或“未访问”并且DFS没有遍历,那么您可以通过创建自定义边来进行访问。你不需要这样做。不,我想你不明白我的问题,可能是我不够清楚。问题是解决印刷材料的问题(显然是静态的)。因此,假设您正在阅读示例1中所示的一本书。您在节点A中,此页面的文本为“转到B页或C页”,然后选择C,然后选择F->B->E->H。您在H中看到的内容应该与通过A->B->D->H进行遍历时看到的内容不同。由于这是一本书,我需要复制一些路径,以便能够根据遍历的路径更改某些节点的内容