Python中的二叉树
我必须用Python实现一个二叉树。树的一个节点具有多个属性。我的要求之一是最低限度的内存使用,特别是数据结构的开销 所以我的问题是,不同的实现方式会产生多少开销。我考虑使用一个字典,其中一个键对于子节点是“left”,另一个键是“right”。另一种方法是为子类使用属性为“left”和“right”的类 这两种选择是否有明显的优点或缺点?还是有更好的选择Python中的二叉树,python,class,dictionary,memory,binary-tree,Python,Class,Dictionary,Memory,Binary Tree,我必须用Python实现一个二叉树。树的一个节点具有多个属性。我的要求之一是最低限度的内存使用,特别是数据结构的开销 所以我的问题是,不同的实现方式会产生多少开销。我考虑使用一个字典,其中一个键对于子节点是“left”,另一个键是“right”。另一种方法是为子类使用属性为“left”和“right”的类 这两种选择是否有明显的优点或缺点?还是有更好的选择 我必须使用Pythons标准库,我使用的是python3.5。Pythondicts很重,内存也很丰富。如果您利用以下优势,则不需要动态属性
我必须使用Pythons标准库,我使用的是python3.5。Python
dicts
很重,内存也很丰富。如果您利用以下优势,则不需要动态属性的类可以相对轻量级:
默认情况下,类的实例具有属性的字典
存储这会为实例很少的对象浪费空间
变量。在创建大型应用程序时,空间消耗可能会变得非常严重
实例数
可以通过在类中定义\uuuuuuuu插槽
来覆盖默认值
定义。\uuuuuuuuuuuuuuuuuuuuu
声明采用一系列实例
变量,并在每个实例中保留足够的空间来容纳
每个变量的值。由于\uuuu dict\uuuu
不可用,因此节省了空间
为每个实例创建
考虑:
In [1]: class Node(object):
...: __slots__ = ('left', 'right','data')
...: def __init__(self, left, right, data):
...: self.left = left
...: self.right = right
...: self.data = data
...:
In [2]: n = Node(None, None, None)
In [3]: d = {}
In [4]: import sys
In [5]: sys.getsizeof(n)
Out[5]: 64
In [6]: sys.getsizeof(d)
Out[6]: 288
我认为您可以使用class、dictionary和namedtuple来实现它 如果要使用类:
class BNode(object):
def __init__(self, val):
self.val = val
self.left = None
self.right = None
import sys
b = BNode(5)
sys.getsizeof(b)
这将在使用python 3.5.2的PC上返回56。
如果我们想对其进行优化,我们将添加_uslot _u属性
class BNode(object):
__slot__ = ('val','left','right')
def __init__(self, val):
self.val = val
self.left = None
self.right = None
b = BNode(5)
这也会在我的电脑上返回56
如果要使用字典:
node_dict = {'left':None, 'right':None, 'val':5}
sys.getsizeof(node_dict)
这将在我的电脑上返回288
还有另一种选择:使用namedtuple
from collections import namedtuple
BNode = namedtuple('BNode', ['val','left','right'])
b = BNode(5, None, None)
sys.getsizeof(b)
这将在我的电脑上返回76
根据上面的代码,我认为我们应该使用带有类的uuu slot uuu来实现您的代码,以考虑内存限制。@PeterWood如果是这样的话,我很高兴sorry@PeterWood当提到其他网站时,指出要清楚,与
class
和dict
相比,namedtuple
是不可变的。在uuu slot的文档中,描述了属性存储在字典中。但在第一个示例中,节点使用的内存与第二个示例中的节点相同。Python有什么改进吗?插槽总是比字典解决方案好吗?如果是这样的话,为什么还要使用字典呢?@matthias gilch当有很多实例时,内存效率非常高。目前,只有一个实例。