基本DFS空间使用情况

时间:2016-08-20 16:42:39

标签: python performance memory

我有一个与空间使用相关的基本问题,我以DFS为例。我不确定这几个实现中的空间使用是否相同,或者是否有一些实际不同。我对空间使用的解释与函数分配的内容直接相关。 任何人都可以帮我验证我制作的这几个例子的空间使用情况吗?这是一个关于空间复杂性的问题,而不是时间+功能

示例1:我们分配将存储N个节点的字典。我很肯定这个人分配O(N)空间。

class Node:
    def __init__(self, children):
        self.children = children

    def getChildren(self):
        return self.children

def dfs(start):
    stack = []
    visited = {}
    stack.append(start)
    while(len(stack) > 0):
        node = stack.pop()
        if(node not in visited):
            visited[node] = True
            for child in node.getChildren():
                stack.append(child)

示例2:我们不在dfs函数中分配任何内容,而是在Node上设置一个标志。我们没有在dfs函数中分配任何东西,所以它是O(1)空间使用。

class Node:
    def __init__(self, children):
        self.children = children
        self.visited = False

    def getChildren(self):
        return self.children

    def getVisited(self):
        return self.visited

    def setVisited(self, visit):
        self.visited = visit

def dfs(start):
        stack = []
        stack.append(start)
        while(len(stack) > 0):
            node = stack.pop()
            if(!node.getVisited()):
                node.setVisited(True)
                for child in node.getChildren():
                    stack.append(child)

示例3:我们有一个可以操作的对象节点,但前面没有标记属性。 DFS在每个节点上手动创建一个标志,从而分配O(N)空间。

class Node:
    def __init__(self, children):
        self.children = children

    def getChildren(self):
        return self.children

def dfs(start):
    stack = []
    stack.append(start)
    while(len(stack) > 0):
        node = stack.pop()
        if(node.visited is not None):
            node.visited = True
            for child in node.getChildren():
                stack.append(child)

1 个答案:

答案 0 :(得分:1)

Space complexity不是由 分配空间决定的,而是需要多少空间(内存)来保存给定的数据结构算法要处理的对象数。

在您的示例中,所有数据结构都需要O(N)空间(N =节点数)