【发布时间】:2019-10-17 15:49:18
【问题描述】:
2-3-4 树的单个节点可以用 8 个指针构造:指向最多四个子节点的指针,指向最多 3 个实际记录的指针,这些记录包含与搜索键匹配或确定哪个键的键要递归到的 4 个子节点,以及一个父节点指针。
当今常见的硬件有 8 字节的指针,给出一个 64 字节的节点。此外,现代 CPU 具有 64 字节的高速缓存行。如果节点与缓存线对齐,那么每个节点只需要一个缓存线命中:在引用七个指针中的第一个之后,其余的都将在您的 L1 缓存中。
虽然红黑树实现起来要简单得多,而且小代码应该是快速代码,但树中的每一级下降都有 L1 缓存未命中的风险。对于 1023 个对象,2-3-4 树需要 5 个节点的最坏情况才能加载到缓存中。完美平衡的二叉树需要 10,但由于不平衡,红黑可能需要更多(不确定最坏的情况:20?)
简单地敲击一个数据结构的小型测试工具可能会将其全部保存在缓存中,因此可能会报告红黑树的性能与 2-3-4 相似。但我有一种感觉,一个复杂的现实世界应用程序可能会看到更少的挂钟时间和更低的延迟,使用 2-3-4 树。
这方面有什么共识或研究吗?
【问题讨论】:
-
按照这个逻辑,你不应该使用二进制堆吗?甚至是 N 元堆?
标签: data-structures red-black-tree 2-3-4-tree