我有一些文本表明序列遵循特定的顺序。一些文本因遍历的踪迹而改变。我的目标是为每个页面生成静态页面,通过链接将它们互连。
问题是解决一个工具的问题,该工具将为印刷书籍生成文本(显然是静态的)。因此,想象一下您正在阅读示例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)以及其他一些主题的内容。我的目标是开发一种算法,以一种可能生成前面提到的页面的方式重新排列给定图形。我没有找到解决这个问题的任何众所周知的问题,但我相信它应该已经存在。我的研究没有找到任何有用的东西,所以我试着自己解决。
我成功的方法包括遍历图表以找到包含依赖于其他节点的内容的节点。找到此节点后,查找从依赖节点到当前节点的所有路径。遍历这些路径,复制包含多个传入边缘的所有节点,删除先前的连接并将当前节点与重复的节点连接,依此类推,直到消耗路径的所有节点。这种算法运行良好,但这种方法效率不高,长文本可能会很慢。
我的问题是:你知道还有其他更好的方法来解决这个问题吗?是否有任何理论或已知算法可以解决这类问题?
提前致谢。
答案 0 :(得分:0)
执行DFS并在看到受访节点时复制它,中断刚刚访问过的链接并将新节点标记为已访问,并从此节点继续dfs。这种方法不会多次访问节点,因此速度最快(意味着它只会访问H1只是2次而不是n次或k次)。
这在输出图方面是线性的。也就是说,如果输出图形具有V'顶点和E'边缘,则其顺序为O(V'+ E')。你不可能做得更好,因为你必须至少访问输出图中的所有内容。
答案 1 :(得分:0)
我假设这些红色边缘的规则是有条理的。将多个内容保留在一个节点中而不是复制它。现在显示的内容取决于到达它的路径,在每一步我们都可以检查DFS的“堆栈”以查看到达它的路径。堆栈将为我们提供到达它的确切路径(但是请注意,它不会详细说明路径是否访问了父级的其他后代)。然后我们将比较我们已经拥有的静态规则并显示内容。
时间复杂度分析(最坏情况): 在DFS的每一步,我们都会根据规则检查整个堆栈。堆栈的最大长度可以是h(其中h是树的高度)。因此,时间复杂度为O((V + E)* h)。
或者,如果路径访问了父级的其他后代(例如分析路径A-> B-> E以及是否已经访问过D),则可以在基于数据结构的基础上自行引入红色边缘根据规则。再次在节点中保留多个内容。在决定显示哪个内容时,只需检查是否已经访问了“源自此顶点的红色边缘”的“端点”。现在使用规则显示适当的内容