优先级队列(JavaScript实现)

本文介绍了优先级队列的工作原理,如何根据元素的优先级决定插入位置,并通过实例说明了在医疗和计算机任务调度中的应用。此外,还展示了如何通过自定义类实现优先级队列的插入操作。
摘要由CSDN通过智能技术生成

我们知道,普通的队列插入一个元素,数据会被放在后端,并且需要前面所有的元素都处理完成后才会处理前面的数据。但是优先级队列,在插入一个元素的时候会考虑该数据的优先级,和其他数据的优先级进行比较。比较完成后,可以得出这个元素在队列中的正确位置,其他的处理方式,和基本队列的处理方式基本一样。

优先级队列主要考虑的问题:

  1. 每个元素不再只是一个数据,而且包含数据的优先级;

  2. 在添加方式中,根据优先级放入正确的位置。

在日常中也有用到优先级队列的例子,比如说医院的(急诊科)候诊室。医生会优先处理病情比较严重的患者。计算机中,我们也可以通过优先级队列来重新排列队列中任务的顺序.比如每个线程处理的任务重要性不同,我们可以通过优先级的大小,来决定该线程在队列中被处理的次序。

二、优先级队列封装

========================================================================

优先级队列的操作和队列的操作方法基本相同,但是插入操作有所不同,所以,我们这里主要是来实现优先级队列的插入操作

比如说我们现在要根据某个数据的优先级来插入元素,这里我们先创建一个类来封装优先级队列,并在其内部创建一个构造函数来保存元素的优先级和数据,再添加一个属性用于存放元素。代码如下:

function PtiorityQueue(){

var items = [];

//封装一个新的构造函数,用于保存元素和元素的优先级

function queueElement(element,priority){

this.element = element;

this.priority = priority;

}

}

创建完成后,在来实现其的插入操作。

  • 如果队列内部没有元素,则直接插入

  • 如果要插入的元素的优先级小于队列内部元素的优先级,则排序后插入。

具体实现代码如下:

function PtiorityQueue(){

this.items = [];

//封装一个新的构造函数,用于保存元素和元素的优先级

function QueueElement(element,priority){

this.element = element;

this.priority = priority;

}

//1.实现插入方法

PtiorityQueue.prototype.enqueue = function(element,priority){

//1.创建queueElement对象

var queueElement = new QueueElement(element,priority);

//2.判断队列是否为空

if(this.items.length == 0){

this.items.push(queueElement);

}else{

var flag = false;

for(var i =0;i<this.items.length;i++){

if(queueElement.priority < this.items[i].priority){

this.items.splice(i,0,queueElement);

flag = true;

break;

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

一个好的心态和一个坚持的心很重要,很多冲着高薪的人想学习前端,但是能学到最后的没有几个,遇到困难就放弃了,这种人到处都是,就是因为有的东西难,所以他的回报才很大,我们评判一个前端开发者是什么水平,就是他解决问题的能力有多强。

分享一些简单的前端面试题以及学习路线给大家,狂戳这里即可免费领取

解决问题的能力有多强。

分享一些简单的前端面试题以及学习路线给大家,狂戳这里即可免费领取

[外链图片转存中…(img-gwpBzYIU-1713669295836)]

  • 29
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,多级反馈队列调度算法是一种进程调度算法,它是基于时间片轮转算法的变体。它将进程按照优先级分成多个队列,然后给每个队列分配不同的时间片,高优先级队列的时间片较短,低优先级队列的时间片较长。如果一个进程在一个队列中运行了一个时间片后仍然没有完成,那么它会被移到下一个队列,并将其时间片重置为原始值。这个过程将一直持续到进程完成或者到达最后一个队列。 以下是使用 JavaScript 实现多级反馈队列调度算法的伪代码: ``` // 定义进程类 class Process { constructor(name, priority, time) { this.name = name; // 进程名称 this.priority = priority; // 进程优先级 this.time = time; // 进程需要执行的时间 } } // 定义多级反馈队列调度算法函数 function multiLevelFeedbackQueue(processes) { const queues = [[], [], []]; // 三个队列,分别存放高、中、低优先级进程 const timeQuantum = [4, 8, 16]; // 不同队列对应的时间片 let currentTime = 0; // 当前时间 let completedProcesses = []; // 完成执行的进程 while (true) { let currentProcess = null; // 从高优先级队列开始查找有没有需要执行的进程 for (let i = 0; i < queues.length; i++) { if (queues[i].length > 0) { currentProcess = queues[i].shift(); break; } } // 如果没有需要执行的进程,退出循环 if (!currentProcess) { break; } // 执行当前进程 for (let i = 0; i < timeQuantum[currentProcess.priority]; i++) { currentProcess.time--; currentTime++; // 如果进程已经执行完毕,将其加入完成队列 if (currentProcess.time === 0) { completedProcesses.push(currentProcess); break; } // 如果进程执行时间超过了当前队列的时间片,将其移到下一个队列 if (i === timeQuantum[currentProcess.priority] - 1) { if (currentProcess.priority < queues.length - 1) { currentProcess.priority++; } queues[currentProcess.priority].push(currentProcess); break; } } } // 返回完成执行的进程 return completedProcesses; } // 测试 const processes = [ new Process('P1', 0, 20), new Process('P2', 1, 10), new Process('P3', 2, 30), new Process('P4', 0, 15), new Process('P5', 1, 5), ]; const completedProcesses = multiLevelFeedbackQueue(processes); console.log(completedProcesses); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值