JS数据结构&算法学习——优先队列

简介: 我们在了解过队列之后,有没有考虑过优先级队列的事情呢?

优先级队列

我们在了解过队列之后,有没有考虑过优先级队列的事情呢?

概念

我们知道普通的队列想要添加元素,元素会被在队尾入队,但是优先级队列它在考虑添加一个元素的时候会考虑添加数据的优先级,即将我们即将插入数据的优先级与其他数据的优先级一一进行比较,在之后我们就可以得到将要添加的元素在队列中正确的位置。

生活中的应用

  1. VIP优先:我们生活中最能体现优先级队列的就是在排队过程中的VIP通道了,当我们在按照队列进行排队的时候,下一个进入的人是VIP,按理说他是应该在队尾添加,但是由于优先级的原因,高于我们这些普通顾客,他就会通过VIP通道被添加到正确的位置
  2. 道德优先:在我们正常排队去挂号的时候,是按照队列来进行排队的,但是会有需要紧急救治的病人,这个时候就体现了优先级的特点,医生会优先救治那些需要紧急救治的病人。

程序应用

在之前的队列中有提到过,线程队列是按照线程次序来执行的,这个时候如果按照线程的优先级大小来排列,就是通过优先级队列来执行

封装

在封装优先级队列之前,我们需要考虑的是我们如何进行优先级比较以及比较规则

当我们的普通的队列拿来看的话,我们是无法对其元素进行比较的,所以我们需要每个元素需要额外的一个能表达该元素优先级的值来体现该元素的优先级,这样我们才能对其优先级进行比较并形成优先级队列,封装如下

function priorityQueue() {
    //队列的属性
    function QueueElement(element, priority) {
      this.element = element
      this.priority = priority
    }
    this.items = []
    //队列的相关操作
    priorityQueue.prototype.enqueue = function (element, priority) {
      //1.创建对象
      var QueueElement = new QueueElement(element, priority)
      this.items.push(element)
    }
}
复制代码

大家可以明显的注意到,我们在优先级队列这个类中又声明了一个类,由于元素具有原本的值与优先级两个数据,所以我们需要在类中再声明一个类,之后的操作封装也是在函数中创建新类,其中element为数据,priority为优先级

那么我们现在开始考虑我们如何得去比较并按优先级排序

  1. 当队列没有元素,只需要添加元素,无序比较
  2. 当队列中有元素,我们需要将添加的元素与前一个数据比较,若小则再比较,直到遇到优先级大的并插入到后面
priorityQueue.prototype.enqueue = function (element, priority) {
      var QueueElement = new QueueElement(element, priority)
      if (this.items.length == 0) {
          this.items.push(QueueElement)
      } else {
          var add = false
          for (let i = 0; i < this.items.length; i++){
              if (QueueElement.priority < this.items[i]){
                  this.items.splice(i,0,QueueElement)
                  add = true
                  break
              }
          }
          if(!add) {
              this.items.push(QueueElement)
          }
      }
}
复制代码

在这里我们首先会进行对队列是否为空判断,可以用自己封装的isEmpty也可以使用length直接进行判断,如果为空则直接插入,接下里如果队列不为空,则声明一个变量表达状态,如果与前面的元素进行比较,优先级都比被添加元素大的话add为false,则执行下面的部分,直接添加到队尾,如果找到了优先级小的元素,则使用splice的方法来进行插入


相关文章
|
2月前
|
存储 监控 算法
局域网监控其他电脑的设备信息管理 Node.js 跳表算法
跳表通过分层索引实现O(logn)的高效查询、插入与删除,适配局域网监控中设备动态接入、IP映射及范围筛选等需求,相比传统结构更高效稳定,适用于Node.js环境下的实时设备管理。
116 9
|
4月前
|
存储 监控 JavaScript
基于布隆过滤器的 Node.js 算法在局域网电脑桌面监控设备快速校验中的应用研究
本文探讨了布隆过滤器在局域网电脑桌面监控中的应用,分析其高效空间利用率、快速查询性能及动态扩容优势,并设计了基于MAC地址的校验模型,提供Node.js实现代码,适用于设备准入控制与重复数据过滤场景。
198 0
|
2月前
|
存储 监控 JavaScript
企业上网监控系统的恶意 URL 过滤 Node.js 布隆过滤器算法
布隆过滤器以低内存、高效率特性,解决企业上网监控系统对百万级恶意URL实时检测与动态更新的难题,通过概率性判断实现毫秒级过滤,内存占用降低96%,适配大规模场景需求。
232 3
|
2月前
|
存储 监控 算法
电脑管控软件的进程优先级调度:Node.js 红黑树算法
红黑树凭借O(log n)高效插入、删除与查询特性,适配电脑管控软件对进程优先级动态调度的高并发需求。其自平衡机制保障系统稳定,低内存占用满足轻量化部署,显著优于传统数组或链表方案,是实现关键进程资源优先分配的理想选择。
145 1
|
6月前
|
前端开发 JavaScript
个人征信电子版无痕修改, 个人信用报告pdf修改,js+html+css即可实现【仅供学习用途】
本代码展示了一个信用知识学习系统的前端实现,包含评分计算、因素分析和建议生成功能。所有数据均为模拟生成
|
3月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
236 3
|
5月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
164 1
|
5月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
153 0

热门文章

最新文章