假设 MAX-HEAPIFY 操作。其中父元素值大于其子元素值。
siftDown 将一个太小的节点与其最大的子节点交换(从而将其向下移动),直到它至少与它下面的两个节点一样大。
siftUp 将一个太大的节点与其父节点交换(从而将其向上移动),直到它不大于其上方的节点。buildHeap 函数接受一个未排序项的数组并移动它们,直到它们都满足堆属性。
有两种方法可以用于 buildHeap。一种是从堆的顶部(数组的开头)开始,并在每个项目上调用 siftUp。在每一步,先前筛选的项目(数组中当前项目之前的项目)形成一个有效的堆,向上筛选下一个项目会将其放置在堆中的有效位置。筛选每个节点后,所有项目都满足堆属性。第二种方法则相反:从数组的末尾开始,然后向后向前移动。在每次迭代中,您筛选一个项目,直到它位于正确的位置。
让数组 a 有 5 个元素 a[4,2,3,5,6] 。
筛选-
输入- a[4,2,3,5,6]
加工-
从数组的开头应用 siftUp 操作。
siftUp(4) -
没有交换,因为它是根
heapified Array-a[4]
Run Code Online (Sandbox Code Playgroud)
筛选(2) -
没有交换,因为父值(4)更多
heapified Array-a[4,2]
Run Code Online (Sandbox Code Playgroud)
筛选(3) -
没有交换,因为父值(4)更多
heapified Array-a[4,2,3]
Run Code Online (Sandbox Code Playgroud)
筛选(5) -
它的父值是 2 所以交换 (5,2)。
Array-a[4,5,3,2]
Run Code Online (Sandbox Code Playgroud)
现在 5 的父值是 4,所以再次交换 (5,4)。
heapified Array-a[5,4,3,2]
Run Code Online (Sandbox Code Playgroud)
筛选(6) -
首先在 (6,4) 之间交换,然后在 (6,5) 之间交换
heapified Array-a[6,5,3,2,4]
Run Code Online (Sandbox Code Playgroud)
输出-a[6,5,3,2,4]
筛选-
输入- a[4,2,3,5,6]
加工-
从数组的末尾,我们将一一应用 siftDown 操作。
筛选(6) -
它没有孩子所以没有交换。同样适用于 siftDown(5) 和 siftDown(3) 也因为他们没有任何孩子。所以他们不能进一步向下移动。
到现在为止的数组 …
假设我有一个键值序列要插入到任意给定顺序的 B 树中。插入所有元素后,我将对其中一些元素执行删除操作。它是否总是给出唯一的结果(以 B 树的形式),还是可以根据删除操作而有所不同?
引用自维基:
链接: https: //en.wikipedia.org/wiki/B-tree
从内部节点删除
内部节点中的每个元素充当两个子树的分隔值,因此我们需要找到分隔的替代值。请注意,左子树中的最大元素仍然小于分隔符。同样,右子树中的最小元素仍然大于分隔符。这两个元素都位于叶节点中,并且任一元素都可以作为两个子树的新分隔符。算法描述如下:
选择一个新的分隔符(左子树中最大的元素或右子树中最小的元素),将其从其所在的叶节点中删除,并用新分隔符替换要删除的元素。
上一步从叶节点中删除了一个元素(新的分隔符)。如果该叶节点现在不足(节点数少于所需数量),则从该叶节点开始重新平衡树。
我认为根据删除操作,它可能会有所不同,因为上面的行以粗体字母引用。我对吗?帮助 :)