繁体   English   中英

Python中的二进制树

[英]Binary Trees in Python

我必须在Python中实现二叉树。 树的一个节点具有多个属性。 我的一个要求是最小的内存使用量,特别是数据结构的开销。

所以我的问题是,通过不同的实现方式产生了多少开销。 我想考虑使用一个字典,其中一个键是“左”,另一个键是“右”的子节点。 另一种方法是使用具有“左”和“右”属性的类为子项。

这两种选择有任何显着的优点或缺点吗? 或者有更好的选择吗?

我将不得不使用Pythons标准库,而我正在使用Python 3.5。

Python dicts很重,记忆力dicts 如果你利用__slots__ ,那么不需要动态属性的类可以比较轻量级:

默认情况下,类的实例具有属性存储的字典。 这会浪费具有很少实例变量的对象的空间。 在创建大量实例时,空间消耗会变得很严重。

可以通过在类定义中定义__slots__来覆盖默认值。 __slots__声明采用一系列实例变量,并在每个实例中保留足够的空间来保存每个变量的值。 保存空间是因为没有为每个实例创建__dict__

考虑:

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返回56。 如果我们想要优化它,我们添加__slot__ atrribute。

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。

根据上面的代码,我认为我们应该使用__slot__和class来实现你的代码来考虑记忆限制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM