Leetcode:bfs / dfs的时间复杂度

时间:2017-05-20 22:47:58

标签: depth-first-search breadth-first-search

根据我的理解,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)

1 个答案:

答案 0 :(得分:2)

首先,算法的复杂性取决于所使用的数据结构。 仅当使用图的邻接列表表示时,BFS和DFS的复杂性才是O(V + E)。

其次,代码不维护被引用的一组节点,这些节点被引用回溯,而不是重新访问相同的节点。

因此,代码的复杂性为O(n ^ 2)而非O(V + E)