【发布时间】:2016-08-20 16:42:39
【问题描述】:
我有一个关于空间使用的基本问题,我以 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 函数中分配任何东西,而是给了我们一个标志来在节点上设置。我们没有在 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:我们有一个可以操作的对象 Node,但前面没有标志属性。 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)
【问题讨论】:
-
好吧,这不是问题的重点。谢谢你至少指出这一点......
-
我明白了,但是您提供的代码中有许多语法错误,这让我觉得这不是您使用的实际代码...
-
没有实际代码。这是一个空间使用问题。
-
...您应该将
stack.insert(0, x)和stack.append(x)和stack.pop(0)更改为stack.pop()。这不会改变您的代码的功能,但会将堆栈中插入/弹出的复杂性从 O(N^2) 更改为 O(N)。 -
@Bakuriu 谢谢我会改变它,但这又不是问题的重点。我会在问题中澄清这一点。
标签: python performance memory