JavaScript数据结构与算法(三) 优先级队列的实现
TypeScript方式实现源码
// Queue类和PriorityQueue类实现上的区别是,要向PriorityQueue添加元素,需要创建一个特殊的元素。这个元素包含了要添加到队列的元素(它可以是任意类型)及在队列中的优先级
class QueueElement {
element;
priority;
constructor(element, priority) {
this.element = element;
this.priority = priority;
}
}
class PriorityQueue {
items = [];
public enqueue(element, priority) {
let queueElement = new QueueElement(element, priority); if (this.isEmpty()) {
this.items.push(queueElement);
} else {
let added = false;
for (let i = ; i < this.items.length; i++) {
if (queueElement.priority < this.items[i].priority) {
this.items.splice(i, , queueElement);
added = true;
break;
}
}
if (!added) {
this.items.push(queueElement);
}
}
}
public dequeue() {
return this.items.shift();
}
public front() {
return this.items[];
}
public isEmpty() {
return this.items.length == ;
}
public clear() {
this.items = [];
}
public size() {
return this.items.length;
}
public print() {
console.log(this.items.toString());
}
}
// 使用方法
let priorityQueue = new PriorityQueue();
priorityQueue.enqueue('John', );
priorityQueue.enqueue('Jack', );
priorityQueue.enqueue('Camila', );
priorityQueue.print(); // 下图中可以看到每条命令的结果
JavaScript方式实现源码
var QueueElement = (function () {
function QueueElement(element, priority) {
this.element = element;
this.priority = priority;
}
return QueueElement;
}());
var PriorityQueue = (function () {
function PriorityQueue() {
this.items = [];
}
PriorityQueue.prototype.enqueue = function (element, priority) {
var queueElement = new QueueElement(element, priority);
if (this.isEmpty()) {
this.items.push(queueElement);
}
else {
var added = false;
for (var i_1 = ; i_1 < this.items.length; i_1++) {
if (queueElement.priority < this.items[i_1].priority) {
this.items.splice(i_1, , queueElement);
added = true;
break;
}
}
if (!added) {
this.items.push(queueElement);
}
}
};
PriorityQueue.prototype.dequeue = function () {
return this.items.shift();
};
PriorityQueue.prototype.front = function () {
return this.items[];
};
PriorityQueue.prototype.isEmpty = function () {
return this.items.length == ;
};
PriorityQueue.prototype.clear = function () {
this.items = [];
};
PriorityQueue.prototype.size = function () {
return this.items.length;
};
PriorityQueue.prototype.print = function () {
console.log(this.items.toString());
};
return PriorityQueue;
}());
代码角度解读:
PriorityQueue对比Queue.PriorityQueue为每个队列元素包裹了一个对象,该对象用于优先级的标记,添加时会对队列中所有数据进行便利计算.其他使用接口一致
抽象:
优先队列的应用场景非常多比如排队买票、地铁安检、飞机登机、任务计划、项目排期.等等都是队列,优先队列是对队列的扩展,比如排队买票只有一个窗口,出于人道主义,
老人与小朋友可以优先.这时优先队列便可以将他们安排到队列前面
总结:
当Queue能解决应用场景问题时不推荐使用PriorityQueue,以此来优化内存开支
JavaScript数据结构与算法(三) 优先级队列的实现的更多相关文章
- java数据结构与算法值优先级队列
一.优先级队列 什么是优先级队列:优先级队列是一种比栈和队列更加常用的一种数据结构.在优先级队列中,数据项按照关键字的值有序.数据项插入到队列中时,会按照顺序插入到合适的位置,用来保证队列的顺序. 生 ...
- JavaScript数据结构与算法(四) 循环队列的实现
实现击鼓传花,需要用到上一章所述队列类Queue TypeScript方式实现源码 let hotPotato = (nameList, num) => { let queue = new Qu ...
- 重读《学习JavaScript数据结构与算法-第三版》- 第5章 队列
定场诗 马瘦毛长蹄子肥,儿子偷爹不算贼,瞎大爷娶个瞎大奶奶,老两口过了多半辈,谁也没看见谁! 前言 本章为重读<学习JavaScript数据结构与算法-第三版>的系列文章,主要讲述队列数据 ...
- JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)
前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...
- 为什么我要放弃javaScript数据结构与算法(第四章)—— 队列
有两种结构类似于数组,但在添加和删除元素时更加可控,它们就是栈和队列. 第四章 队列 队列数据结构 队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序 ...
- 为什么我要放弃javaScript数据结构与算法(第三章)—— 栈
有两种结构类似于数组,但在添加和删除元素时更加可控,它们就是栈和队列. 第三章 栈 栈数据结构 栈是一种遵循后进先出(LIFO)原则的有序集合.新添加的或待删除的元素都保存在栈的同一端,称为栈顶,另一 ...
- javascript数据结构与算法---队列
javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...
- JavaScript数据结构与算法-队列练习
队列的实现 // 队列类 function Deque () { this.dataStore = []; this.enqueueFront = enqueueFront; this.enqueue ...
- 重读《学习JavaScript数据结构与算法-第三版》-第2章 ECMAScript与TypeScript概述
定场诗 八月中秋白露,路上行人凄凉: 小桥流水桂花香,日夜千思万想. 心中不得宁静,清早览罢文章, 十年寒苦在书房,方显才高志广. 前言 洛伊安妮·格罗纳女士所著的<学习JavaScript数据 ...
随机推荐
- Python类中的self到底是干啥的
Python类中的self到底是干啥的 Python编写类的时候,每个函数参数第一个参数都是self,一开始我不管它到底是干嘛的,只知道必须要写上.后来对Python渐渐熟悉了一点,再回头看self的 ...
- C++中输出流的刷新问题和 endl和 \n的区别
<C++ Primer>第5版 P6中提到endl具有换行和刷新输出流两个作用,那么没有 endl是否还会将输出流中的内容输出到设备中,再刷新输出流呢? cout << &qu ...
- Spark ML源码分析之四 树
之前我们讲过,在Spark ML中所有的机器学习模型都是以参数作为划分的,树相关的参数定义在treeParams.scala这个文件中,这里构建一个关于树的体系结构.首先,以Decis ...
- 记录python接口自动化测试--利用unittest生成测试报告(第四目)
前面介绍了是用unittest管理测试用例,这次看看如何生成html格式的测试报告 生成html格式的测试报告需要用到 HTMLTestRunner,在网上下载了一个HTMLTestRunner.py ...
- 设计模式NO.2
设计模式NO.2 本次博客内容为第二次设计模式的练习.根据老师的要求完成下列题目: 题目1 如果需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows.Linux.UNIX等)上播放多 ...
- (原创)不带模板的OLE输出EXCEL
目前我已知的EXCEL输出方式有3种: 1.GUI_DOWNLOAD函数输出(适用于简单无格式要求的输出). 2.OLE输出(适用于对EXCEL格式输出有特殊要求的,但是因其填充数据和设置格式是基于一 ...
- nyoj 概率计算
概率计算 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 A和B两个人参加一场答题比赛.比赛的过程大概是A和B两个人轮流答题,A先答.一旦某人没有正确回答问题,则对手 ...
- 关于 Ubuntu Linux 16.04中文版的 root 权限及桌面登录问题
新接触 Ubuntu 的朋友大多会因为安装中没有提示设置 root 密码而不太清楚是什么原因. 起初 Ubuntu 团队希望安装尽可能的简单. 不使用 root , 在安装期间的两个用户交互步骤可以省 ...
- Oracle 使用pl/sql将表中的数据读出到文件中
(1)在服务器上创建文件路径及文件 [oracle@redhat errormsg]$ touch test01.txt (2)在数据库中创建路径及授权 (3)创建存储过程 CREATE OR REP ...
- Python-socket网络编程-Day8
目录Day8-Python socket 11.Socket 11.1.socket和file的区别: 11.2.WEB服务应用: 21.3.更多功能 21.4.socket方法: 41.5. 服务端 ...
