web前端算法简介之队列

news2024/9/28 23:24:22
  • 队列
    • 队列基本操作
      • 入队(enqueue):将元素添加到队列的尾部。
      • 出队(dequeue):从队列的头部移除元素。
      • 队首(front):获取队列头部的元素,但不移除它。
      • 队尾(rear):获取队列尾部的元素,但不移除它。
      • 判空(isEmpty):判断队列是否为空。
      • 大小(size):获取队列中元素的数量。
  • JvaScript 任务队列
    • 为什么 JavaScript 是单线程?
    • 事件循环(Event Loop)与消息队列的关系:
      • 宏任务队列(Macrotask Queue):
      • 微任务队列(Microtask Queue):
    • 事件循环:
      • 事件循环的基本流程如下:
  • 关于栈的前端算法题
    • 最近的请求次数

队列

队列(Queue)是一种常见的数据结构,它类似于排队的形式,遵循 先进先出(FIFO) 的原则。在队列中,元素在尾部添加,而在头部移除。这就类似于排队时,先来的人先服务,后来的人排在后面等待服务。

队列,和栈一样,也是一种对数据的"存"和"取"有严格要求的线性存储结构。

与栈结构不同的是,队列的两端都"开口",要求数据 只能从一端进,从另一端出 ,如图 1 所示:

通常,称进数据的一端为 "队尾",出数据的一端为 "队头",数据元素进队列的过程称为 "入队",出队列的过程称为 "出队"。

不仅如此,队列中数据的进出要遵循 “先进先出” 的原则,即最先进队列的数据元素,同样要最先出队列。

拿图 1 中的队列来说,从数据在队列中的存储状态可以分析出,元素 1 最先进队,其次是元素 2,最后是元素 3。

此时如果将元素 3 出队,根据队列 “先进先出” 的特点,元素 1 要先出队列,元素 2 再出队列,最后才轮到元素 3 出队列。

栈和队列不要混淆,栈结构是一端封口,特点是"先进后出";而队列的两端全是开口,特点是"先进先出"。

因此,数据从表的一端进,从另一端出,且遵循 “先进先出” 原则的线性存储结构就是队列。

队列基本操作

队列通常包括以下几种基本操作:

入队(enqueue):将元素添加到队列的尾部。
出队(dequeue):从队列的头部移除元素。
队首(front):获取队列头部的元素,但不移除它。
队尾(rear):获取队列尾部的元素,但不移除它。
判空(isEmpty):判断队列是否为空。
大小(size):获取队列中元素的数量。

队列常常用于实现广度优先搜索(BFS)、线程池、缓存等应用场景,是计算机科学中非常重要的数据结构之一。

更多详细内容,请微信搜索“前端爱好者戳我 查看

JvaScript 任务队列

为什么 JavaScript 是单线程?

JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事

那么,为什么JavaScript 不能有多个线程呢 ?这样能提高效率啊。

JavaScript 的单线程,与它的用途有关。

作为浏览器脚本语言,JavaScript 的主要用途是与用户互动,以及操作 DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。

比如,假定JavaScript 同时有两个线程,一个线程在某个 DOM 节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?

所以,为了避免复杂性,从一诞生,JavaScript 就是单线程,这已经成了这门语言的核心特征,将来也不会改变。

单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。

一种非阻塞的事件循环机制就产生了:

  • 消息队列:消息队列是一个先进先出的队列,它里面存放着各种消息。
  • 事件循环:事件循环是指主线程重复从消息队列中取消息、执行的过程。

在JavaScript中,消息队列是事件驱动架构的核心部分,用于管理异步任务的执行顺序。

由于JavaScript在浏览器环境中被设计为单线程(即同一时间只能执行一个任务),为了处理异步操作(如网络请求、定时器、DOM事件等),它采用了一种非阻塞的事件循环机制。

事件循环(Event Loop)与消息队列的关系:

宏任务队列(Macrotask Queue):
  • 也称为Task Queue或Job Queue,包含那些需要在 主线程空闲时执行的任务
  • 宏任务包括:
    • 脚本整体代码、
    • setTimeout、
    • setInterval、
    • I/O、
    • UI渲染、
    • AJAX回调函数等。
微任务队列(Microtask Queue):
  • 又称Promise Job Queue,优先级高于宏任务队列
  • 微任务包括:
    • Promise.then/catch/finally、
    • MutationObserver、
    • process.nextTick(Node.js环境)、
    • async/await(内部基于Promise)等。

事件循环:

事件循环的基本流程如下:
  1. 初始阶段:JS引擎开始执行全局脚本(这也是一个宏任务)。

  2. 同步执行:从上到下逐行执行代码,遇到异步操作(如fetch请求或setTimeout调用)则不会阻塞执行流,而是将回调函数放入相应的消息队列。

  3. 检查微任务队列:当前宏任务执行完毕后,立即查看微任务队列是否有待执行的任务。如果有,则按先进先出(FIFO)原则执行所有微任务。

  4. 渲染阶段:在执行完所有的微任务之后,浏览器会进行一次渲染更新(如果有必要的话)。

  5. 检查宏任务队列:然后轮询宏任务队列,取出第一个宏任务来执行。

  6. 重复循环:以上步骤不断循环,形成了所谓的“事件循环”。

因此,在JavaScript中,消息队列不是单一的一个队列,而是至少包含两个层次的任务队列(宏任务队列和微任务队列)。

这种结构确保了即使在单线程环境下,也能实现异步编程和高效的并发处理能力。

这种机制就叫做事件循环机制,取一个消息并执行的过程叫做一次循环。

关于栈的前端算法题

最近的请求次数

写一个 RecentCounter 类来计算特定时间范围内最近的请求。

请你实现 RecentCounter 类:

  • RecentCounter() 初始化计数器,请求数为 0 。
  • int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。
    保证 每次对 ping 的调用都使用比之前更大的 t 值。

示例 1:

输入:
["RecentCounter", "ping", "ping", "ping", "ping"]
[[], [1], [100], [3001], [3002]]
输出:
[null, 1, 2, 3, 3]

解释:
RecentCounter recentCounter = new RecentCounter();
recentCounter.ping(1);     // requests = [1],范围是 [-2999,1],返回 1
recentCounter.ping(100);   // requests = [1, 100],范围是 [-2900,100],返回 2
recentCounter.ping(3001);  // requests = [1, 100, 3001],范围是 [1,3001],返回 3
recentCounter.ping(3002);  // requests = [1, 100, 3001, 3002],范围是 [2,3002],返回 3

提示:

1 <= t <= 109
保证每次对 ping 调用所使用的 t 值都 严格递增
至多调用 ping 方法 10^4 次

实现代码


var RecentCounter = function () {
    // 新建一个队列,用于存储数据
    this.stack = []
}


/** 
 * @param {number} t
 * @return {number}
 */
RecentCounter.prototype.ping = function (t) {
    // 把数据存储在队列中
    this.stack.push(t)
    while (this.stack[0] < t - 3000) {
        // 如果满足条件,则出队
        this.stack.shift(t)
    }

    return this.stack.length
};

/**
 * Your RecentCounter object will be instantiated and called as such:
 * var obj = new RecentCounter()
 * var param_1 = obj.ping(t)
 */

参考文档

  • https://c.biancheng.net/view/3352.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1379318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32H5培训(二)性能提升与功耗优化

文章目录 1. 前言2. 性能提升3. 功耗优化参考&#xff1a; 1. 前言 本篇主要介绍STM32H5系列的性能提升和功耗优化方面的具体表现。H5系列相比于F4系列在性能和功能上有较大的升级&#xff0c;包括更强的内核、更高的主频、更快的flash访问速度、更丰富的通信接口和先进的安全…

word2003图片不显示

如图&#xff0c;可以看出图片内容空白&#xff0c;只剩下图片边框了。这种原因是在视图选项中勾选了显示图片窗按钮&#xff0c;才会这样。 解决方法是&#xff0c;如图&#xff0c;选择打开工具菜单下的选项窗口&#xff0c;然后在选项窗口中选择视图标签&#xff0c;然后…

PyTorch安装教程(Win10),含遇到的问题及解决办法

1. 环境准备 首先&#xff0c;打开PyTorch官网&#xff1a;https://pytorch.org/get-started/locally/ 向下可以看到有如下几个条件&#xff1a; Python&#xff1a;PyTorch仅支持Python3.x&#xff0c;不支持Python2.x&#xff1b; Package Manager&#xff1a; Anaconda&am…

kubebuilder+code-generator开发k8s的controller

本文记录用kubebuilder和code-generator开发k8s的crd控制器。 概览 和k8s.io/code-generator类似&#xff0c;是一个码生成工具&#xff0c;用于为你的CRD生成kubernetes-style API实现。区别在于&#xff1a; Kubebuilder不会生成informers、listers、clientsets&#xff0c…

nodejs 版本为node-v16.14.0-x64的安装及环境变量配置

大家好&#xff0c;又见面了&#xff0c;我是你们的朋友全栈君。 第一步 安装node包 地址建议去阿里云 nodejs-release-v16.14.0安装包下载_开源镜像站-阿里云 在这里插入图片描述 安装地址在D盘下的nodejs文件夹 全部默认安装&#xff0c;一直next直到安装结束 在这里插…

js 中 复杂json 组装 实例通用模式

js 中 复杂json 组装 实例 目录概述需求&#xff1a; 设计思路实现思路分析1.js 中 复杂json 组装 实例2.js 中 复杂json 动态 组装 实例3.嵌套数组 参考资料和推荐阅读 ) Survive by day and develop by night. talk for import biz , show your perfect code,full busy&…

【二、自动化测试】为什么要做自动化测试?哪种项目适合做自动化?

自动化测试是一种软件测试方法&#xff0c;通过编写和使用自动化脚本和工具&#xff0c;以自动执行测试用例并生成结果。 自动化旨在替代手动测试过程&#xff0c;提高测试效率和准确性。 自动化测试可以覆盖多种测试类型&#xff0c;包括功能测试、性能测试、安全测试等&…

Unity2022.3打包Android后从AB包加载场景发现丢失大量脚本问题

问题 这两天遇到一个问题&#xff0c;在VR项目打包Android的时候&#xff0c;加载场景后&#xff0c;Timeline工作不正常&#xff0c;找不到原因。 现象 看到有很多警告&#xff0c;丢失脚本的Log。 因为场景本身也有一些丢失的脚本所以没在意&#xff0c;但是又不是所有脚本…

Linux 【C编程】IO进阶— 阻塞IO、非阻塞IO、 多路复用IO、 异步IO

文章目录 1.阻塞IO与非阻塞IO1.1为什么有阻塞式&#xff1f;1.2非阻塞 2.阻塞式IO的困境3.并发IO的解决方案3.1非阻塞式IO3.2多路复用IO3.2.1什么是多路复用IO&#xff1f;3.2.1多路复用IO select原理3.2.1多路复用IO poll原理 3.3异步IO 1.阻塞IO与非阻塞IO 1.1为什么有阻塞式…

Msa全球最新研究:多系统萎缩特效药全球最新进展

多系统萎缩是一种罕见的神经系统疾病&#xff0c;它涉及到多个系统的功能减退或丧失。对于这种疾病&#xff0c;传统的西医治疗方法往往束手无策。然而&#xff0c;中国著名中医刘家峰大夫&#xff0c;却通过中药治疗&#xff0c;为多系统萎缩患者带来了新的希望。 刘家峰大夫…

idea使用docker-compose发布应用程序

非常重要的话说在前头 idea要想使用docker-compose&#xff0c;不能使用ssh创建idea Docker&#xff0c;而需要使用socket创建idea Docker。 socket docker是不安全的&#xff0c;任何人都可以访问你的docker&#xff0c;所以只能测试环境使用&#xff0c;请勿在正式环境使用s…

TreesVariety

树木品种 - 树木和植物捆绑包。与“植被引擎”兼容的包装 通用和HDRP的树木包在这里 树木品种: ● 支持Unity Wind; ● 11种树木,7种植物; ● Unity树创建器树(可编辑); ● 与内置管道配合使用; ● 支持地形广告牌。 树木: ● 8棵桦树; ● 4块枫木; ● 8块橡木; ●…

代码随想录-刷题第五十五天

72. 编辑距离 题目链接&#xff1a;72. 编辑距离 思路&#xff1a;本题是用动规来解决的经典题目&#xff0c;这道题目看上去好像很复杂&#xff0c;但用动规可以很巧妙地算出最少编辑距离。动态规划五步曲分析&#xff1a; dp[i][j]表示以下标i-1为结尾的字符串word1&#x…

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题一 理论题

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…

Git的简单使用说明

Git入门教程 git的最主要的作用&#xff1a;版本控制&#xff0c;协助开发 一.版本控制分类 ​​ 1.本地版本控制 ​​ 2.集中版本控制 ​​ 所有的版本数据都存在服务器上&#xff0c;用户的本地只有自己以前所同步的版本&#xff0c;如果不连网的话&#xff0c;用户就看不…

Springboot+vue整合 支付宝沙箱支付

可以完成的功能&#xff1a; 一、拉起支付 二、异步回调 三、掉单处理 四、超时关闭 五、订单退款

ssh远程登录

ssh协议 ---基于 tcp 的 22 号端口 确认是否有ssh包&#xff1a; [rootserver ~] rpm -qa | grep sshopenssh-clients-8.7p1-24.el9_1.x86_64openssh-server-8.7p1-24.el9_1.x86_64 1、 ssh的验证过程 第一阶段&#xff1a;版本协商以及tcp三次握手 第二阶段&#xff1a;秘钥和…

C# 图解教程 第5版 —— 第22章 命名空间和程序集

文章目录 22.1 引用其他程序集22.2 命名空间22.2.1 命名空间名称22.2.2 命名空间的补充22.2.3 命名空间跨文件伸展22.2.4 嵌套命名空间 22.3 using 指令22.3.1 using 命名空间指令22.3.2 using 别名指令22.3.3 using static 指令 22.4 程序集的结构22.5 程序集标识符22.6 强命名…

微信小程序(二)事件绑定

注释很详细&#xff0c;直接上代码 新增内容&#xff1a; 点击事件绑定注册页面设置页面初始化数据事件处理函数的实现更新数据并更新视图 源码&#xff1a; index.wxml <!-- 页面的数据绑定 --> <view>{{msg}}</view> <!-- 绑定点击事件 --> <but…

高防ip是什么,防护效果好吗

DDoS攻击是互联网最常见的网络攻击方式之一&#xff0c;通过大量虚假流量对目标服务器进行攻击&#xff0c;堵塞网络耗尽服务器性能&#xff0c;导致服务器崩溃&#xff0c;真正的用户无法访问。以前企业常用的防御手段就是高防服务器&#xff0c;也就是硬防&#xff0c;但由于…