具有低内存使用率的自平衡AVL树

Self Balancing AVL Tree with low memory usage?

本文关键字:平衡 AVL 使用率 内存      更新时间:2023-10-16

自平衡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)低内存使用。

Q:是否有可能减少自平衡AVL树数据结构的内存使用?

我也有类似的项目,我也做了类似的搜索。

我的答案是基于纯粹的技术方面,不赞成AVL算法。

你可以尝试打包结构/类。不管大家怎么说,这不会影响x86机器上的性能。

编辑:
你绝对需要移除指向父类的指针。

将所有内容包装在master类中,而不是top节点。

那么你可能能够在2字节内打包平衡,但它会减少树的总体大小。

那么在某些时候,您可能会发现标准(linux) malloc分配了大量额外的空间。这可以用jemalloc修复。但是,jemalloc的性能比标准malloc慢。

如果你愿意,你可以试试谷歌的tcmalloc。它的性能优于标准malloc,内存使用率介于标准malloc和bjemalloc之间。然而,tcmalloc被认为是beta或不稳定的。

我也会建议,如果你可以,直接存储数据在你的树节点,例如,不使用指针。这将节省8个字节和一个额外的分配。

作为最后一个节点,请检查std::map和std::set -它们是红黑树,工作得非常好。

请务必检查跳过列表。稍后我将在我的实现中添加注释。我的跳跃表的性能与std::map相似(稍微慢一点,我不能做很好的比较),但是内存使用比std::map好20 - 30%。