美文网首页
heap_堆_PriorityQueues

heap_堆_PriorityQueues

作者: 阿_贵 | 来源:发表于2018-10-18 10:08 被阅读0次

一、概念

1.  Priority Queues:即带有优先级的队列(先进先出),较好实现方式:大根堆,或小根堆。

2.  堆总是满足下列性质:

a.  堆中某个节点的值总是不大于或不小于其父节点的值;

b.  堆总是一棵完全二叉树。

将根节点最大的堆叫做大根堆,根节点最小的堆叫做小根堆(binary min-heap (minimum key is at the root))。

3.  满二叉树与完全二叉树:

如果一棵二叉树的结点要么是叶子结点,要么它有两个子结点,这样的树就是满二叉树。

若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

二、堆 -> 数组

“堆”存储在数组中,某个 i(数组下标)节点的孩子的数组下标为:i * 2,i * 2 + 1,例如:

X   T O   G S M N    A E R A I B

1   2 3     4 5 6 7     8 9 10 11 12    (数组下标从1开始,也可以从0开始)

三、downheap() 与 upheap()

1.  downheap() -> O(log n)

删除 root -> 堆的最后一个节点替换 root -> "修复堆",root如果有必要与"子节点"交换 -> 被改变的子节点继续"修复堆"

2. upheap()-> O(log n)

插入一个节点到堆的最后 ->  "修复堆",该节点如果有必要与"父节点"交换 -> 被改变的父节点继续 "修复堆"

四、堆 -> 构造

1. downheap() -> O(n)

bottom-up heap construction 自下而上堆的构造

自下而上,从右至左的方向,找到第一个“非叶子节点”,如果有必要与"子节点"交换(如果左右节点相等,交换任意一个都可)

即用 downleap() 方法,对每一个子堆

2. upheap() -> O(n log n)

一个一个节点增加到堆的最后 -> 用 upheap() 方法"修复堆"

五、堆排序

堆排序:O(n log n)

相关文章

  • heap_堆_PriorityQueues

    一、概念 1. Priority Queues:即带有优先级的队列(先进先出),较好实现方式:大根堆,或小根堆。 ...

  • PostgreSQL 源码解读(4)- 插入数据#3(heap_

    本文简单介绍了PG插入数据部分的源码,这是第三部分,主要内容包括heap_insert函数的实现逻辑,该函数在源文...

  • 堆 - 堆的应用

    堆有三个典型的应用场景:实现优先队列、求 Top K 、求中位数 实现优先队列 优先队列:队列的性质是先进先出,但...

  • 二叉堆是一棵满二叉树,父节点的值大于子节点。 用数组存储二叉堆,假如一个节点的下标为k,那么这个节点的左孩子就是2...

  • 应用: 排序,从小到大用最大堆,从大到小用最小堆 选出元素中的 top k 个top k 个最小数:数组前k个元素...

  • 完全二叉树 二叉堆 二叉堆有最大堆和最小堆的区别,最大堆只保证每个节点的父节点大于当前节点,但不保证上一层节点的值...

  • 堆的定义: n个元素序列{k1,k2,...,ki,...,kn},当且仅当满足下列关系时称之为堆: (ki...

  • http://bubkoo.com/2014/01/14/sort-algorithm/heap-sort/ 1 ...

网友评论

      本文标题:heap_堆_PriorityQueues

      本文链接:https://www.haomeiwen.com/subject/gftjzftx.html