美文网首页
JavaScript数据结构-优先队列

JavaScript数据结构-优先队列

作者: 写前端的大叔 | 来源:发表于2019-11-28 23:10 被阅读0次

前面学习过队列这种数据结构,该数据结构的特点是先进先出,但有时候会出现特殊情况,比如在我们排队买票时,会有军人优先、老人优先等,当碰到军人买票时,得让他们优先购买,这就破坏了先进先出的结构,导致出现了另外一种数据结构,就是今天需要整理的优先队列

概念

优先队列也称为,是指在队列中,具有优先级特性的元素,最先出队的元素。出队和入队的顺序无关,跟优先级相关。

优先队列表示方法

优先队列可以使用一种中做二叉树的结果来保存堆中的数据,被称作为二叉堆二叉堆是一棵完全二叉树。所以我们可以使用数组来表示优先队列。对于数组中任一位置i上的元素,其左儿子在位置2i上,右儿子在(2i+1)上,它的父新则在位置i/2上。以下是一个优先队列,并通过数组来表示它。

堆.jpeg

优先队代码实现

下面通过简单的代码来实现优先队列。

function Heap() {
    var items = [];
    /*
    * 判断是否为空
    * */
    this.isEmpty = function () {
        return items.length === 0;
    }

    /*
    * 返回堆的大小
    * */
    this.size = function () {
        return items.length;
    }

    /*
    * 返回父节点的索引值
    * */
    this.parentNode = function (index) {
        if(index !== 0){
            return parseInt((index - 1)/2);
        }
        return -1;
    }

    /*
    * 返回左孩子节点的索引值
    * */
    this.leftChild = function (index) {
        return 2*index + 1;
    }

    /*
    * 返回右孩子节点的索引值
    * */
    this.rightChild = function (index) {
        return 2*index + 2;
    }

    /*
    * 向堆 中插入元素
    * */
    this.insert = function (data) {
        items.push(data);
        this.siftUp(items.length - 1);
    }
    
    /*
    * 上浮
    * */
    this.siftUp = function (index) {
        var parentIndex = this.parentNode(index);
        while (index > 0 && items[index] > items[parentIndex]){
            var temp = items[parentIndex];
            items[parentIndex] = items[index];
            items[index] = temp;
            index = parentIndex;
        }
    }

    /*
    * 删除最大元素
    * 1:取出最大元素
    * 2:用最小元素替换最大元素
    * 3:删除最小位置的数
    * 4:作用下沉操作重新构造堆
    * */
    this.deleteMax = function () {
        if(items.length === 0){
            return null;
        }
        var max = items[0];
        var last = items[items.length - 1];
        items[0] = last;
        items[items.length - 1] = max;
        items.pop();
        this.siftDown(0)

        return max;
    }

    /*
    * 下沉
    * */
    this.siftDown = function (index) {
        while (this.leftChild(index) < items.length){
            var leftIndex = this.leftChild(index);//找出左节点索引位置
            if(leftIndex + 1 < items.length && items[leftIndex + 1] > items[leftIndex]){//有右节点,并且右节点大于左节点时,替换成右节点
                leftIndex ++;
            }
            if(items[index] >= items[leftIndex]){
                break;
            }
            // 交换
            var temp = items[index];
            items[index] = items[leftIndex];
            items[leftIndex] = temp;
            index = leftIndex;
        }
    }

    this.print = function () {
        console.log(JSON.stringify(items));
    }
}

具体的代码可以在源码中进行查看
个人博客

相关文章

  • 看图说话数据结构之二项队列(优先队列)——原理解析

    数据结构之二叉堆(优先队列)——原理解析,数据结构之二叉堆(优先队列)——java实现,数据结构之左式堆(优先队列...

  • GO语言实现 一 堆与优先队列

    堆与优先队列 优先队列 之前我们讲过队列这种数据结构,队列的特点是先进先出,那什么是优先队列呢?一般来说,优先队列...

  • JavaScript数据结构-优先队列

    前面学习过队列这种数据结构,该数据结构的特点是先进先出,但有时候会出现特殊情况,比如在我们排队买票时,会有军人优先...

  • javaScript数据结构--优先队列

    元素的添加是基于优先级的。 function PriorityQueue() { var items = []...

  • 优先队列(堆)

    优先队列 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当...

  • 二叉堆应用二:优先队列

    优先队列 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。删...

  • 数据结构(三)-- 优先队列

    什么是优先队列? 我们在前几篇文章中学习过了“队列”这种数据结构。那么优先队列和普通队列有什么区别的呢?普通队列的...

  • PriorityQueue原理与最简实现[kotlin]

    什么是优先队列? 优先队列是一种能按照数据的优先级,在输出的时候能依次输出的一种数据结构。 优先队列的核心方法 *...

  • 堆排序

    1. 优先队列 说堆排序之前,我们要从一种特殊的数据结构——优先队列说起。优先队列最大的两个特征:插入元素和删除最...

  • 优先队列--底层是二叉堆

    1.什么是优先队列?普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予...

网友评论

      本文标题:JavaScript数据结构-优先队列

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