Data structures 为什么许多类型的堆数据结构中的节点只有两个子节点?

Data structures 为什么许多类型的堆数据结构中的节点只有两个子节点?,data-structures,heap,Data Structures,Heap,从维基 每个节点可以拥有的最大子节点数取决于堆的类型,但在许多类型中,最多只能有两个,这称为二进制堆 我不明白为什么在许多类型中,堆中的节点最多只有两个子节点?为什么三个孩子或四个孩子等都不常见?谢谢~大多数类型的堆每个节点最多有两个子堆不是真的,但是二进制堆(每个节点最多有两个子堆)是最常用的实现类型。它是最常用的实现类型,因为它简单、缓存友好、内存效率高 用于二进制堆的数据结构可以与每个节点不同数量的子节点一起使用。如果我们认为 x是常数,则x进制堆中的公共操作仍将采用 O(log n)<

从维基

每个节点可以拥有的最大子节点数取决于堆的类型,但在许多类型中,最多只能有两个,这称为二进制堆


我不明白为什么在许多类型中,堆中的节点最多只有两个子节点?为什么三个孩子或四个孩子等都不常见?谢谢~

大多数类型的堆每个节点最多有两个子堆不是真的,但是二进制堆(每个节点最多有两个子堆)是最常用的实现类型。它是最常用的实现类型,因为它简单、缓存友好、内存效率高

用于二进制堆的数据结构可以与每个节点不同数量的子节点一起使用。如果我们认为<强> x是常数,则x进制堆中的公共操作仍将采用<强> O(log n)< /强>时间。然而,为了决定最佳的x,我们必须让它变化,在这种情况下,常见的操作需要O(x*logn/logx)时间

为了确定每个节点最有效的子节点数,我们可以选择x来最小化因子x/log x

如果绘制该图,您可以看到每个节点的最佳子节点数实际上是3(最小值为x=e,但我们需要一个整数):


。。。但是2和3之间的差异并不显著,每个节点使用2个子节点的代码更简单,因此这是常见的做法。

但是2和3之间实际运行时间的差异非常显著。我的测试表明,从二进制堆到3堆的速度提高了10%到20%。主要是因为3堆比二进制堆对缓存更友好。@JimMischel对于实际测试非常有用!10-20%的比例与情节相当吻合。我承认,在某些情况下,你可以考虑这一点。你如何确定<代码>缓存友好< /代码>?@ AdityaGupta,这是一个需要多少内存块才能平均读取到处理器缓存的问题。使用更少的内存,使用连续的内存,或者对许多操作使用相同的内存或附近的内存,都有助于减少读取到cache.Aah中的块数。所以,当我遍历n元树时,n个子数据被加载到缓存中。是这样吗?但我们以后无论如何都不需要这些数据,因为我们会进一步深入到树中。它有什么好处?