根据我的理解,DFS和BFS都采用O(V + E)。但搜索算法是否有可能具有不同的时间复杂度?
例如,在此问题中(https://leetcode.com/problems/kill-process/#/description)使用DFS需要比BFS更长的时间。
BFS:
class Solution(object):
def bfs(self, pid, ppid, tmp, output):
child = []
for i in xrange(len(ppid)):
if ppid[i] in tmp:
output.append(pid[i])
child.append(pid[i])
if child != []:
self.bfs(pid, ppid, child, output)
def killProcess(self, pid, ppid, kill):
"""
:type pid: List[int]
:type ppid: List[int]
:type kill: int
:rtype: List[int]
"""
output, tmp = [kill], [kill]
self.bfs(pid, ppid, tmp, output)
return output
时间复杂度:O(NlgN)
DFS:
class Solution(object):
def dfs(self, pid, ppid, kill, output):
for i in xrange(len(ppid)):
if ppid[i] == kill:
if kill not in output:
output.append(kill)
self.dfs(pid, ppid, pid[i], output)
if kill not in output:
output.append(kill)
def killProcess(self, pid, ppid, kill):
"""
:type pid: List[int]
:type ppid: List[int]
:type kill: int
:rtype: List[int]
"""
output = []
self.dfs(pid, ppid, kill, output)
return output
时间复杂度:O(N ^ 2)
答案 0 :(得分:2)
首先,算法的复杂性取决于所使用的数据结构。 仅当使用图的邻接列表表示时,BFS和DFS的复杂性才是O(V + E)。
其次,代码不维护被引用的一组节点,这些节点被引用回溯,而不是重新访问相同的节点。
因此,代码的复杂性为O(n ^ 2)而非O(V + E)