在二叉最大堆中插入一个新元素
Insertion of a new element in Binary Max Heap
考虑向MaxHeap中插入元素的过程,其中MaxHeap由数组表示。假设我们对新叶子到根的路径进行二分查找,寻找新插入元素的位置,比较次数为:
A) Θ(logn)
B) Θ(loglogn)
C) Θ(n)
D) Θ(nlogn)
============================================= ============================
假设我将最大堆设为
100
/ \
80 90
/\ /\
50 40 70 60
现在说我插入了一个新元素 250,它将添加到最后一个叶节点,如下所示 -
100
/ \
80 90
/\ /\
50 40 70 60
/
250
现在通过添加 250 个最大堆 属性 被违反,我必须调用 Max heaping 这将占用 O(log n),但我的问题是现在数组未排序,如您所见最大堆,那么我们如何应用二分查找呢?
看到数组是 100|80|90|50|40|70|60|250 和从叶到根的路径
包含 100|80|50|250 的节点,这不是排序数组,那么,我们如何应用二进制搜索?
另一个问题 - 如果我添加了一个不会违反最大堆的新元素 属性 假设我添加了新元素 30,那么数组将按降序排序并且我可以应用二进制搜索。
那么,我应该如何在考试中解决这个问题?
堆数组明显没有排序
路径已排序,但要插入的最后一个节点除外。它被排序是因为在最大堆中任何节点都大于或等于它的子节点,并且由于路径是由子节点组成的,它们将按降序排列。在此设置中我们可以忽略的最后一个节点,因为我们知道它不合适。
所以题目要求你在路径上二分查找新节点插入的位置。路径的长度为 O(logN)。对 N 个元素进行二分查找的复杂度为 O(logN)。所以复杂度为 O(loglogN).
这不会产生正确的堆,它只会告诉您插入新节点的位置。您仍然必须沿着路径将每个节点移动到堆中更深的位置,这仍然是 O(logN)。
鉴于此最大堆:
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)。
考虑向MaxHeap中插入元素的过程,其中MaxHeap由数组表示。假设我们对新叶子到根的路径进行二分查找,寻找新插入元素的位置,比较次数为:
A) Θ(logn)
B) Θ(loglogn)
C) Θ(n)
D) Θ(nlogn)
============================================= ============================
假设我将最大堆设为
100
/ \
80 90
/\ /\
50 40 70 60
现在说我插入了一个新元素 250,它将添加到最后一个叶节点,如下所示 -
100
/ \
80 90
/\ /\
50 40 70 60
/
250
现在通过添加 250 个最大堆 属性 被违反,我必须调用 Max heaping 这将占用 O(log n),但我的问题是现在数组未排序,如您所见最大堆,那么我们如何应用二分查找呢?
看到数组是 100|80|90|50|40|70|60|250 和从叶到根的路径
包含 100|80|50|250 的节点,这不是排序数组,那么,我们如何应用二进制搜索?
另一个问题 - 如果我添加了一个不会违反最大堆的新元素 属性 假设我添加了新元素 30,那么数组将按降序排序并且我可以应用二进制搜索。
那么,我应该如何在考试中解决这个问题?
堆数组明显没有排序
路径已排序,但要插入的最后一个节点除外。它被排序是因为在最大堆中任何节点都大于或等于它的子节点,并且由于路径是由子节点组成的,它们将按降序排列。在此设置中我们可以忽略的最后一个节点,因为我们知道它不合适。
所以题目要求你在路径上二分查找新节点插入的位置。路径的长度为 O(logN)。对 N 个元素进行二分查找的复杂度为 O(logN)。所以复杂度为 O(loglogN).
这不会产生正确的堆,它只会告诉您插入新节点的位置。您仍然必须沿着路径将每个节点移动到堆中更深的位置,这仍然是 O(logN)。
鉴于此最大堆:
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)。