具有低内存使用率的自平衡AVL树
Self Balancing AVL Tree with low memory usage?
自平衡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机器上的性能。
编辑:
你绝对需要移除指向父类的指针。
那么你可能能够在2字节内打包平衡,但它会减少树的总体大小。
那么在某些时候,您可能会发现标准(linux) malloc分配了大量额外的空间。这可以用jemalloc修复。但是,jemalloc的性能比标准malloc慢。
如果你愿意,你可以试试谷歌的tcmalloc。它的性能优于标准malloc,内存使用率介于标准malloc和bjemalloc之间。然而,tcmalloc被认为是beta或不稳定的。
我也会建议,如果你可以,直接存储数据在你的树节点,例如,不使用指针。这将节省8个字节和一个额外的分配。
作为最后一个节点,请检查std::map和std::set -它们是红黑树,工作得非常好。
请务必检查跳过列表。稍后我将在我的实现中添加注释。我的跳跃表的性能与std::map相似(稍微慢一点,我不能做很好的比较),但是内存使用比std::map好20 - 30%。
相关文章:
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 堆栈问题(平衡表达式问题集)
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- 二叉树结构平衡,使用递归时EXC_BAD_ACCESS
- 使用非递归插入方法实现 AVL 树
- 我正在尝试制作一个自平衡机器人,但编译时存在错误。我不知道如何解决它
- 迭代器范围的平衡分区,没有LegacyRandomAccessIterator
- 使用堆栈从黑客等级中解决平衡括号检查的错误
- 从 AVL 树中删除指向 1 个或多个值的键
- C++如何在宏调用后平衡括号?
- 签入二叉树的函数是平衡C++
- 检查BST中每个节点的平衡因子并将其存储在节点中
- 我该如何平衡一棵退化的树?C++数据结构
- 如何过滤avl树的数据
- OpenMP 和不平衡嵌套循环
- 如何修复重新平衡时AVL删除操作中的分段错误?
- AVL插入和平衡环路
- 为什么是我的AVL树删除功能不平衡
- 具有低内存使用率的自平衡AVL树
- AVL树从来没有不均衡的平衡C++