Algorithm DFS中的DFS,具有已知字符串的DFS

Algorithm DFS中的DFS,具有已知字符串的DFS,algorithm,recursion,depth-first-search,Algorithm,Recursion,Depth First Search,我正在寻找我的代码的复杂性计算。它只是DFS中的DFS(深度优先搜索)。DFS在图形(状态机)上自始至终运行(反向搜索)。无论何时到达开始,它都会累积使其到达开始的字符串,并在另一个具有另一个DFS的图形上尝试该字符串,以检查它是否也在具有相同字符串的另一个图形上到达开始状态 外部DFS复杂性定义为O(Vo+Eo),其中Vo:外部图中的顶点数,Eo:外部图中的边数。但是,当后面的字符串已知时,DFS内部的复杂性是什么 如果可能的话,你能回答整个算法的复杂性吗 我不确定它是O((Eo+Vo)+(E

我正在寻找我的代码的复杂性计算。它只是DFS中的DFS(深度优先搜索)。DFS在图形(状态机)上自始至终运行(反向搜索)。无论何时到达开始,它都会累积使其到达开始的字符串,并在另一个具有另一个DFS的图形上尝试该字符串,以检查它是否也在具有相同字符串的另一个图形上到达开始状态

外部DFS复杂性定义为O(Vo+Eo),其中Vo:外部图中的顶点数,Eo:外部图中的边数。但是,当后面的字符串已知时,DFS内部的复杂性是什么

如果可能的话,你能回答整个算法的复杂性吗

我不确定它是O((Eo+Vo)+(Ei+Vi))还是O((Eo+Vo)(Ei+Vi))或smtg


提前感谢您,

这取决于您在第二次DFS失败时所做的操作。失败意味着第二个图形不包含在第一个DFS中找到的字符串

如果第二个DFS失败意味着您回溯并搜索第一个DFS中的另一个字符串,然后再次尝试第二个DFS,那么您的复杂性是
O((Eo+Vo)*(Ei+Vi))
,因为在最坏的情况下,您可能会对第一个DFS中指向起始节点的每个DFS路径执行第二个图形的完整DFS

如果第二个DFS失败意味着您停止,那么最坏情况下,您将执行第一个图形的单个DFS和第二个图形的单个DFS,从而获得
O((Eo+Vo)+(Ei+Vi))
最坏情况的复杂性


您正在进行DFSing以检查图形是否包含字符串,这意味着在某些情况下,您可以提前终止DFS(例如,您到达一个非开始顶点,并且没有要检查的字符)。然而,你是否能够提前终止完全取决于图的结构,所以我想说,第二个DFS在最坏的情况下仍然是
O(Ei+Vi)
,因为在一个糟糕的图中,你可能仍然会发现自己穿过所有的边和顶点。

O(| string |(Eo+Vo))…其中| string |是stringd的大小。这是我一开始的想法,但是第二个DFS中搜索的路径没有以开始状态结束呢?难道不应该有一些累积项而不仅仅是|字符串|吗?这是因为你正在使用图来进行有限状态机解析,如果它是确定性的,那么它是O((Eo+Vo)+字符串|),如果它是随机的,那么它是O((Eo+Vo)*字符串|),在第二个DFS中不可能到达起始点。它必须通过在第一个DFS中获得的字符串到达start。因此,它在第二个DFS中尝试第一个DFS中到达起始位置的每个字符串。因为最坏的情况是我们关心的,最坏的情况不可能比| string |更糟,正如Khaled所说,它不应该与O(Ei+Vi)有关。我遇到的问题是,如果它多次尝试那根长度为| string |的绳子,并最终到达起点,该怎么办。也应该大于| string |@uleSelin如果在第二个图中有一个顶点,它有许多边,这些边都标有相同的字符?可能吗?我认为使用
O(Ei+Vi)
你是安全的,因为第二个DFS不能超过这个值,因此你有一个很好的(如果不是最小的)上界。现在我明白你的意思了。这绝对是一个安全的界限,但我想这不是我想要的确切界限。对于这个问题,不可能同一个字符出现在不同的边缘,这是一个DFA。但是一个顶点可以有来自其他顶点的同一角色的边,因为这是一个反向搜索,所以可能会出现包括进入错误路径然后找到正确路径的情况。在这种情况下,您的答案有效吗?@ŞuleSelin如果第二个图形是DFA,为什么不从开始节点开始第二次搜索,并检查它是否进入结束节点?这应该相当于从结束节点开始并检查它是否到达开始,但速度更快。然后,您将确保从未输入错误的路径,因此您的运行时将是
O((Eo+Vo)*|string |)
。是的,这应该更容易,但我有多个开始,回溯到任何开始对我来说在开始时似乎更容易。此外,还有一些不可观察的事件可能会使从第一个DFS(完全可观察字符串)获得的字符串在非常不同的位置结束。谢谢你的建议,但无论如何,对目前的情况有什么答案吗?