自平衡AVL树通常使用列表实现。每个节点包含:
pointer to parent (8 bytes on 64 bit apps)
pointer to left child (8 bytes on 64 bit apps)
pointer to right child (8 bytes on 64 bit apps)
balance (4 bytes)
pointer to the data struct (8 bytes on 64 bit apps)
由于数据在内存中对齐,我们每个项目需要40 bytes
。
在我的应用程序中,我需要 a)非常快速的查找, b)非常快速的插入和 c)内存使用率低。
问:是否可以减少Self Balancing AVL Tree数据结构的内存使用量?
答案 0 :(得分:0)
我有类似的项目,我为你做了类似的研究。
我的答案是基于纯技术方面,而不是AVL算法。
您可以尝试打包struct / class。尽管每个人都说,这不会影响x86机器的性能。
编辑:
你肯定需要删除指向父项的指针。而不是顶级节点,将所有内容包装在主类中。
然后你可能能够以2个字节打包平衡,但它会减少树的整体大小。
然后在某些时候你可能会发现标准(linux)malloc分配了大量的额外空间。这可以用jemalloc修复。但是,jemalloc性能比标准malloc慢。
如果您愿意,可以尝试google的tcmalloc。它的性能比标准malloc和标准malloc andbjemalloc之间的中间位置都要差。然而,tcmalloc被认为是beta或不稳定。
我也建议如果可以,将数据直接存储在树节点中,例如不要使用指针。这将节省8个字节和一个额外的分配。
作为最终节点,请检查std :: map和std :: set - 这些是红黑树,工作得非常好。
请检查跳过列表。我稍后会为我的实现添加注释。我的跳过列表的性能类似于std :: map(比较慢,我不能做好比较),但内存使用率要好20 - 30%。