• JavaScript数据结构与算法(三) 优先级队列的实现


    TypeScript方式实现源码

     1 // Queue类和PriorityQueue类实现上的区别是,要向PriorityQueue添加元素,需要创建一个特殊的元素。这个元素包含了要添加到队列的元素(它可以是任意类型)及在队列中的优先级
     2 class QueueElement {
     3     element;
     4     priority;
     5     constructor(element, priority) {
     6         this.element = element;
     7         this.priority = priority;
     8     }
     9 }
    10 class PriorityQueue {
    11     items = [];
    12     public enqueue(element, priority) {
    13         let queueElement = new QueueElement(element, priority);
    14 
    15         if (this.isEmpty()) {
    16             this.items.push(queueElement);
    17         } else {
    18             let added = false;
    19             for (let i = 0; i < this.items.length; i++) {
    20                 if (queueElement.priority < this.items[i].priority) {
    21                     this.items.splice(i, 0, queueElement);
    22                     added = true;
    23                     break;
    24                 }
    25             }
    26             if (!added) {
    27                 this.items.push(queueElement);
    28             }
    29         }
    30     }
    31     public dequeue() {
    32         return this.items.shift();
    33     }
    34     public front() {
    35         return this.items[0];
    36     }
    37     public isEmpty() {
    38         return this.items.length == 0;
    39     }
    40     public clear() {
    41         this.items = [];
    42     }
    43     public size() {
    44         return this.items.length;
    45     }
    46     public print() {
    47         console.log(this.items.toString());
    48     }
    49 }
    50 // 使用方法
    51 let priorityQueue = new PriorityQueue();
    52 priorityQueue.enqueue('John', 2);
    53 priorityQueue.enqueue('Jack', 1);
    54 priorityQueue.enqueue('Camila', 1);
    55 priorityQueue.print();
    56 
    57 // 下图中可以看到每条命令的结果

    JavaScript方式实现源码

     1 var QueueElement = (function () {
     2     function QueueElement(element, priority) {
     3         this.element = element;
     4         this.priority = priority;
     5     }
     6     return QueueElement;
     7 }());
     8 var PriorityQueue = (function () {
     9     function PriorityQueue() {
    10         this.items = [];
    11     }
    12     PriorityQueue.prototype.enqueue = function (element, priority) {
    13         var queueElement = new QueueElement(element, priority);
    14         if (this.isEmpty()) {
    15             this.items.push(queueElement);
    16         }
    17         else {
    18             var added = false;
    19             for (var i_1 = 0; i_1 < this.items.length; i_1++) {
    20                 if (queueElement.priority < this.items[i_1].priority) {
    21                     this.items.splice(i_1, 0, queueElement);
    22                     added = true;
    23                     break;
    24                 }
    25             }
    26             if (!added) {
    27                 this.items.push(queueElement);
    28             }
    29         }
    30     };
    31     PriorityQueue.prototype.dequeue = function () {
    32         return this.items.shift();
    33     };
    34     PriorityQueue.prototype.front = function () {
    35         return this.items[0];
    36     };
    37     PriorityQueue.prototype.isEmpty = function () {
    38         return this.items.length == 0;
    39     };
    40     PriorityQueue.prototype.clear = function () {
    41         this.items = [];
    42     };
    43     PriorityQueue.prototype.size = function () {
    44         return this.items.length;
    45     };
    46     PriorityQueue.prototype.print = function () {
    47         console.log(this.items.toString());
    48     };
    49     return PriorityQueue;
    50 }());
    代码角度解读:
        PriorityQueue对比Queue.PriorityQueue为每个队列元素包裹了一个对象,该对象用于优先级的标记,添加时会对队列中所有数据进行便利计算.其他使用接口一致
    抽象:
        优先队列的应用场景非常多比如排队买票、地铁安检、飞机登机、任务计划、项目排期.等等都是队列,优先队列是对队列的扩展,比如排队买票只有一个窗口,出于人道主义,
    老人与小朋友可以优先.这时优先队列便可以将他们安排到队列前面 总结: 当Queue能解决应用场景问题时不推荐使用PriorityQueue,以此来优化内存开支
  • 相关阅读:
    python中使用自定义类实例作为字典的key
    IO概念和五种IO模型
    谈谈有关 Python 的GIL 和 互斥锁
    python中的赋值与深浅拷贝
    Python 中的__new__和__init__的区别
    MAC地址和IP地址是否缺一不可
    linux安装软件的几种方式
    python中字典以key排序,以value排序。以及通过value找key的方式
    python中字母与ASCII码之间的转换以及进制间的转换
    自定义标签实现分页(转载)
  • 原文地址:https://www.cnblogs.com/menu/p/6963764.html
Copyright © 2020-2023  润新知