我正在寻找代码的复杂性计算。它只是DFS中的DFS(深度优先搜索)。 DFS从一端到另一端(向后搜索)在图形(状态机)上运行。每当它到达开始时,它会累积使其达到启动的字符串,并在另一个图表上使用另一个DFS尝试该字符串,以检查它是否也在另一个图表上使用相同的字符串达到启动状态。
外部DFS复杂度定义为O(Vo + Eo)其中Vo:外部图中的顶点数和Eo:外部图中的边数。但是,当将要遵循的字符串已知时,内部DFS的复杂性是什么?
如果可能的话,你能否回答算法的整体复杂性?
我不确定是O((Eo + Vo)+(Ei + Vi))还是O((Eo + Vo)(Ei + Vi))或smtg .else
提前谢谢你,
答案 0 :(得分:0)
这取决于您在第二个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)
,因为有一个讨厌的图表,你可能仍然会发现自己经历了所有边缘和所有顶点。