答案 0 :(得分:0)
您已经提出了很多问题,所以我会尝试依次回答所有问题。
k-ary堆上的heapify操作的运行时是O(n),它与k无关。这并不是很明显,但大多数介绍性算法教科书都证明了k = 2时的结果。
让我们一般对k-ary堆进行分析,然后我们可以通过设置k = 2来比较二进制堆。在k-ary堆中,a的成本find-min操作是O(1)(只看堆的顶部),并且堆化操作的成本是O(n),如上所述。将新元素添加到k-ary堆时,运行时与堆的高度成比例,即O(log k n)= O(log n / log k)(后面跟随)从使用对数的基础变化公式)。在big-O表示法中包含对数的基数并不常见,但在这种情况下,因为k是一个参数,我们不能忽略它的贡献。在extract-min操作中,我们需要从树的顶部到底部工作。在每个级别,我们查看当前节点的最多k个子节点以找到最大值,然后可能进行交换。这意味着每层有O(k)工作,并且有O(log n / log k)层,因此完成的工作是O(k log n / log k)。渐近地,对于任何固定的k,这些操作的运行时间分别是O(1),O(n),O(log n)和O(log n),因此k之间没有渐近差异。 -ary heap和二进制堆。
但在实践中,存在差异。看到这个的一个好方法是让k真的非常大(比如10 100 )。在这种情况下,删除的成本将非常大,因为每个节点最多有10个 100 子节点,这将使相应二叉树的高度相形见绌。对于k(k = 3或4)的中间值,有可能实际上在二叉树上使用3元树或4元树实际上更快,但实际上找出的最佳方法是要描述它,看看会发生什么。参考局部性,缓存和分割速度等因素的相互作用将相互竞争以影响运行时间。
是的!有多道搜索树这样的东西。其中最着名的是B-tree,这实际上是一个非常有趣的数据结构,可供阅读。
希望这有帮助!