在Binary Max Heap中插入新元素

时间:2018-06-21 08:14:38

标签: arrays algorithm data-structures heap

请考虑将元素插入MaxHeap的过程,其中MaxHeap由数组表示。假设我们在从新叶子到根的路径上执行二进制搜索,以找到新插入元素的位置,执行的比较次数为:

A)Θ(登录)

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 ,这不是一个排序的数组,那么,如何应用二元搜索?

另一个要点-如果我添加了一个不会违反max堆属性的新元素,比如说我添加了30个新元素,那么数组将以降序排序,并且我可以应用Binary搜索。

那么,我应该如何在考试中解决这个问题?

2 个答案:

答案 0 :(得分:1)

堆数组显然没有排序。

该路径已排序,除了要插入的最后一个节点。之所以进行排序,是因为在最大堆中,任何节点都大于或等于其子节点,并且由于路径是由子节点构成的,因此它们的降序排列。在此设置中,我们可以忽略的最后一个节点,因为我们知道它不合适。

因此,该问题要求您通过路径上的二进制搜索找到要插入新节点的位置。路径的长度为O(logN)。二进制搜索是N个元素的O(logN)。因此复杂度将为O(loglogN)。

这不会导致正确的堆,它只会告诉您插入新节点的位置。您仍然必须沿着路径将每个节点移到堆中更深的位置,而这仍然是O(logN)。

答案 1 :(得分:1)

给出此最大堆:

                               100
                              /    \
                            80       90
                            /\       /\
                           50 40    70 60

您知道必须将新元素250插入路径[100, 80, 50]的某个位置。您知道这是因为在标准堆插入方法中,您将新项添加到数组的第一个空闲位置,然后将其筛选到堆中。在这种情况下,将其添加到位置7,到根的路径是7-> 3-> 1-> 0。

如果您应用二进制搜索来确定该项目将沿着该路径插入的位置,则会发现该项目必须在值100之前。

我认为该问题旨在测试您对堆属性的了解。在n项堆中,有log(n)个级别。我们将该值称为h。从根到最后一级项目的路径将包含h个项目。二进制搜索已知为O(log n)。或者,在这种情况下,为O(log h)。并且由于h == log(n),答案是O(log log n)。