数据结构——二叉堆和优先队列

一、概念

队列和堆都是一种数据结构,优先队列是用二叉堆实现的。优先队列和堆常用语辅助实现其它算法,例如数据压缩赫夫曼编码算法、Dijkstra最短路径算法、Prim最短生成树算法,优先队列还可以实现事件模拟、选择问题,操作系统的线程调度也使用优先队列。

优先队列

特点:元素正常入队,按照优先级大小出队。
实现方式:有序表或无序表(即数组,或顺序表和链表)、二叉树、AVL平衡二叉树、堆和二叉堆。使用普通的表实现优先队列的性能比较低,有序表插入为O(1),无序表取出为O(n),另外使用普通二叉树实现优先队列只能保证平均时间为O(log n),但最差情况是O(n),AVL树则需要复杂的无关操作,而堆可以实现性能较好的优先队列,取出效率可达到O(1),一般的操作都能达到O(log n)。

二叉堆

特点:二叉堆是完全二叉树,分为最大堆和最小堆两种类型,最小堆中根结点的关键字是其它所有结点关键字的最小值,最大堆则是最大值。
表示方式:完全二叉树是二叉堆的逻辑表示方式,数组是二叉堆的物理表示,也是计算机中的实际形式。
应用:堆排序复杂度O(nlogn)、优先队列

// 二叉堆构造函数,capacity: 容量(决定二叉堆大小),compare: 比较函数(决定是最大堆还是最小堆),array: 数组
function BinaryHeap(capacity, compare, array){
   
    if(array){
   
        this.array = array.concat();
        this.size = array.length;
        
        if(capacity < 3)
            this.capacity = this.size * 2;
        else
            this.capacity = capacity;
        this.compare = compare;
    }
    else{
   
        if(capacity < 3)
            return null;
        this.array = new Array(capacity);
        this.size = 0;
        this.capacity = capacity;
        this.compare = compare;
    }
}
// 检查二叉堆是否已空
BinaryHeap.prototype.isEmpty = function(){
   
    return this.size == 0;
}
// 获取结点i的父结点
BinaryHeap.prototype.parent = function(i){
   
    return Math.floor(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值