【发布时间】:2018-06-21 08:14:37
【问题描述】:
考虑将元素插入 MaxHeap 的过程,其中 MaxHeap 由数组表示。假设我们对从新叶子到根的路径进行二分查找以找到新插入元素的位置,执行的比较次数为:
A) Θ(logn)
B) Θ(loglogn)
C) Θ(n)
D) Θ(nlogn)
================================================ ============================
假设我把 Max Heap 作为
100
/ \
80 90
/\ /\
50 40 70 60
现在说我插入了一个新元素 250,它将添加到最后一个叶节点,如下所示 -
100
/ \
80 90
/\ /\
50 40 70 60
/
250
现在通过添加 250 个最大堆属性被违反,我必须调用最大堆,这将花费 O(log n),但我的问题是现在数组没有排序,正如你从最大堆中看到的那样,那么如何我们完全应用二进制搜索吗?
看到数组是 100|80|90|50|40|70|60|250 和从叶子到根的路径
包含节点为 100|80|50|250 并且这不是排序数组,那么,我们如何应用二分查找?
另一个例子 - 如果我添加了一个不会违反最大堆属性的新元素,比如我添加了新元素 30,那么数组将按降序排序,我可以应用二进制搜索。
那么,我应该如何在考试中解决这个问题?
【问题讨论】:
-
请注意,每条路径都已排序。
-
二进制堆数组不应该排序
-
"max heaping" 不使用二分查找。
O(log n)的复杂性与“改进的”二叉树的高度有关 - 通过将索引除以 2 并与该位置的元素进行比较,您逐渐向根移动 -
@YvesDaoust 每条路径是如何排序的?哦,意思是,当我添加新元素 250 时,从叶子(250)到根(100)的路径没有排序。
-
@YvesDaoust 没有其他方法可以添加 1 个元素。您应该破坏堆属性并通过 heapify 恢复它。为了外面的世界,应该是同步操作的,但还是..
标签: arrays algorithm data-structures heap