请考虑将元素插入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搜索。
那么,我应该如何在考试中解决这个问题?
答案 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)。