宝马娱乐官网手机版右儿子在2i+2

当前位置:宝马娱乐官方网站 > 宝马娱乐官网手机版 > 宝马娱乐官网手机版右儿子在2i+2
作者: 宝马娱乐官方网站|来源: http://www.darmini.com|栏目:宝马娱乐官网手机版

文章关键词:宝马娱乐官方网站,上推队列

  而不需要使用其他数据结构。所以我们只需要传入一个size就可以构建优先队列的结构(元素之间使用compareTo方法进行比较)。

  对于数组中的任意位置 i 的元素,其左儿子在位置2i上,则右儿子在2i+1上,宝马娱乐官网手机版父节点在 在i/2(向下取整)上。通常从数组下标1开始存储,这样的好处在于很方便找到左右、及父节点。如果从0开始,左儿子在2i+1,右儿子在2i+2,父节点在(i-1)/2(向下取整)。

  我们这建立最小堆,即对于每一个元素X,X的父亲中的关键字小于(或等于)X中的关键字,根节点除外(它没有父节点)。

  如图所示,只有左边是堆,右边红色节点违反堆序性。根据堆序性,只需要常O(1)找到最小元。

  图中演示了18插入的过程,在下一个可用的位置建立空穴(满足结构性),发现不能直接插入,将父节点移下来,空穴上冒。继续这个过程,直到满足堆序性。这样就实现了元素插入到优先队列(堆)中。

  可以反复使用交换操作来进行上滤过程,但如果插入X上滤d层,则需要3d次赋值;我们这种方式只需要d+1次赋值。

  如果插入的元素是新的最小元从而一直上滤到根处,那么这种插入的时间长达O(logN)。但平均来看,上滤终止得要早。业已证明,执行依次插入平均需要2.607次比较,因此平均insert操作上移元素1.607层。上滤次数只比插入次数少一次。

  :类似于上滤操作。因为我们建立的是最小堆,所以删除最小元,宝马娱乐官网手机版就是将根节点删掉,这样就破坏了结构性。所以

  我们在根节点处建立空穴,为了满足结构性,堆中最后一个元素X必须移动到合适的位置,如果可以直接放到空穴,则删除完成(一般不可能);否则,将空穴的左右儿子中较小者移到空穴,即空穴下移了一层。继续这样的操作,直到X可以放入到空穴中。

  如图所示:在根处建立空穴,将最后一个元素放到空穴,已满足结构性;为满足堆序性,需要将空穴下移到合适的位置。

  注意:堆的实现中,经常发生的错误是只有偶数个元素,即有一个节点只有一个儿子。所以需要测试右儿子的存在性。

  这种操作最坏时间复杂度是O(logN)。宝马娱乐官网手机版平均而言,被放到根处的元素几乎下滤到底层(即来自的那层),所以平均时间复杂度是O(logN)。

  优先队列常使用二叉堆实现,本篇图解了二叉堆最基本的两个操作:插入及删除最小元。insert以O(1)常数时间执行,deleteMin以O(logN)执行。相信大家看了之后就可以去看java的PriorityQueue源码了。今天只说了二叉堆最基本的操作,还有一些额外操作及分析下次再说。比如,如何证明buildHeap是线性的?以及优先队列的应用等。

网友评论

我的2016年度评论盘点
还没有评论,快来抢沙发吧!