Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有低内存使用率的自平衡AVL树?_C++_Algorithm_Data Structures - Fatal编程技术网

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

C++ 具有低内存使用率的自平衡AVL树?,c++,algorithm,data-structures,C++,Algorithm,Data Structures,自平衡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) 由于数据在内存中对齐,因此每个项

自平衡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字节

在我的应用程序中,我需要a)极快的查找,b)极快的插入和c)低内存使用率


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

我有类似的项目,我也做过类似的研究

我的答案是基于纯粹的技术方面,没有对AVL算法

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

编辑:
您肯定需要删除指向父级的指针。将所有内容包装到主类中,而不是顶部节点

然后,您可能能够在2个字节内打包平衡,但这将减少树的总体大小

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

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

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

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


请检查跳过列表。稍后我将在实现中添加注释。我的跳过列表的性能类似于std::map(稍慢一些,我不能很好地进行比较),但内存使用率提高了20-30%。

不要把指针指向家长。我正在学习SO是如何工作的,我不明白为什么我的问题被否决了,有人能解释一下吗?您的第2个问题不符合SO的顺序。它要求人们为你工作。无论是实际的编码还是研究。为了得到有意义的答案,你需要展示你为什么要这么做。在开源软件中有很多优秀的AVL树库(参见示例),它们将告诉您平衡只需要2位(库通常使用1字节)。不需要父指针。此外,人们似乎一致认为红黑树更简单,平均性能略高(avl查找速度稍快,但插入/删除速度较慢,在许多应用程序中占主导地位)。例如,java LIBS使用了我所看到的源代码中的红黑树。如果不需要删除节点(除了删除所有节点时),可以将所有节点保持在一个数组中(或者C++ >代码> STD::vector)SkpList:注意:此skiplist是位专用的,如果不至少重写比较/存储对的部分,则无法使用。