数据结构与算法(三)

news2024/11/24 16:33:42

一、队列

队列(queue):它是一种一种运算受限的线性表,FIFO(先进先出)

栈:后进先出

受限之处:它只允许表的前端(front)进行删除操作,在表的后端(rear)进行插入操作

面对无法同时处理多个请求的场景,我们通常就会使用队列,先进先出。

一个一个的解决问题,保证有序

 队列的基本操作:

  • enqueue(element):向队列尾部添加一个(或多个)新的项
  • dequeue():移除队列的第一(即排在队列最前面的)项,并返回被移除的元素
  • front():返回队列中第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息——与Stack类的peek方法非常类似)
  • isEmpty():如果队列中不包含任何元素,返回true,否则返回false
  • size():返回队列包含的元素个数,与数组的length属性类似
class Queue{
		constructor(){
			this.items = [];
		}
		// 入队操作
		enqueue(elem){
			this.items.push(ele);
		}
		// 出队操作
		dequeue(){
			return this.item.shift();
		}
		// 查看队首元素
		front(){
			return this.items[0];
		}
		// 查看队尾
		rear(){
			return this.items[this.items.length-1];
		}
		// 查看队列是否为空
		isEmpty(){
			return this.items.length  === 0;
		}
		// 返回队列包含的元素个数
		size(){
			return this.items.length;
		}
		// 清空队列
		clear(){
			this.items=[];
		}
	}
	const queue = new Queue();

 二、JS异步队列

javascript:单线程,同一个时间只能执行一个任务,前一个任务结束了以后,才能执行下一个任务。

线程是最小的执行单元,进程是最小的资源管理单元(线程是从属于进程)

JS的主要作用:完成与用户交互,以及DOM操作。避免复杂性,从一开始,JS就是单线程

H5 ,web worker 标准,它是允许JS 创建多个线程,但是,子线程是完全受主线程控制的,而且子线程是不可以操作DOM的。

IO的时候,(输入输出的时候),主线程不去管IO,挂起处于等待中的任务,先运行排在后面的任务,等待IO设备返回了结果,再回过头,把挂起等待的任务继续执行下去。于是所有的任务分为同步任务和异步任务。同步会阻塞后面的代码,异步任务在主线程一有空,就立即执行,不是等待0秒。

  • 同步任务:在主线程上排队执行的任务,只有前一个任务执行完毕以后,才能够去执行下一个任务。
  • 异步任务:不进入主线程,而是进入“任务队列”,只有“任务队列”通知主线程,某个异步任务可以执行了,这个任务才会进入主线程执行。

最先执行的是:同步代码,执行完毕以后,立即出栈,让出主线程

同步代码执行完毕,立即出栈,此时主线程是出于:空闲状态

主线程去读取任务队列,队列遵循的原则是先进先出,但是,有个条件:触发条件相等,会遵循先进先出,如果触发条件不相同,则优先执行到达触发条件的代码,主线程一有空就立即执行

主线程里边维护着一个任务队列,这个任务保存的是:异步的代码

JS是单线程语言,浏览器只会分配一个主线程给JS,用来执行任务(函数)

但是一次只能执行一个任务。 

console.log(1);
setTimeout(()=>{
   console.log(2);
},50);
setTimeout(()=>{
   console.log(3);
},0);
console.log(4);

// 1432
// 定时器、ajax、事件 (异步的)

执行栈进行如下:

  1. 所有的同步任务都是在主线程上执行,形成一个执行栈
  2. 主线程之外,还存在一个任务队列,只要存在异步任务,就会在任务队列里放置一个事件
  3. 一旦执行栈里边同步任务代码执行完毕,主线程就会去读取“任务队列”,看任务队列有哪些对应的异步任务,结束等待状态,进入执行栈,开始执行

主线程不断重复上面3个步骤

主线程执行完毕以后,从事件队列中去读取任务队列的过程,我们称之为事件循环(Event Loop)

任务队列

 任务队列:存在着两个队列,一个是宏任务队列,一个是微任务队列

主线程:同步任务->微任务->宏任务

I/O,定时器、事件绑定、ajax ...存在于宏任务队列里的

Promise.then catch finally process.nextTick 都是存在微任务队列

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

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

相关文章

如何高效搭建影视及游戏工业化管线?

影视和游戏工业化是指制作流程上呈现出标准化、自动化、平台化、数智化的特征。工业化趋势会让制作影视和游戏门槛变高,让其进入精品对决时代。 不进行迭代,就面临被淘汰的危险。 随着受众对于影视和游戏质量的要求越发“苛刻”,精品化是整…

neovim下window的快捷切换

neovim下window的快捷切换 在使用emacs的时候,喜欢加插件window-numbering。 这样在分屏之后的emacs里,通过配置快捷键leaderwnumber 跳转到对应的windows, 而且该软件会在对应底部显示数字提示,非常方便。 另外:为什么不用快捷键leadernumb…

听老人一句劝,别去外包,干了四年,废了....

我是一个普通二本大学机械专业毕业,目前做IT行业的软件测试已经有4年多了,18年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个…

【源码篇】基于SSM+JSP实现的学生宿舍管理系统

系统介绍 基于SSMJSP实现的学生宿舍管理系统是一个基于B/S模式的学生宿舍管理系统,为学生、学校和宿管阿姨搭建了一个灵活自由并且安全可靠的管理平台。 系统设计了6大菜单模块,分别是 学生管理:学生信息的添加、修改、删除、查询、Excel导…

VariantAutoencoder(VAE)中使用生成好的模型进行声音生成

文章目录 概述一、soundgenerator.py文件soundgenerator.py实现代码一、convert_spectrogram_to_audio方法librosa.db_to_amplitudelibrosa.istft generate方法 二、generate.py文件实现代码load_fsdd函数说明select_spectrogram函数说明save_signals函数说明main函数说明 三、…

ESP32-C2模组使用AT固件示例

ESP32C2 AT固件使用 ESP32 C2模组,如图1-1所示 图1-1 ESP32 C2模组 ESP32 C2开发板,如图1-2所示 图1-2 ESP32 C2开发 方案亮点 1、完整的 WiFi 子系统,符合 IEEE 802.11b/g/n 协议,具有 Station 模式、SoftAP 模式、SoftAP Stat…

npm依赖更新无效

项目场景: 项目是使用ice2.0.0搭建的react项目 项目需要替换新版本的sdk,使用npm进行对应sdk的版本升级 问题描述 卸载sdk tnpm uninstall tds/sdk安装最新版本sdk tnpm i tds/sdk^0.0.16控制台依旧输出旧版本的输出 解决过程 提示:这里填写问题接解决…

C++设计模式之工厂方法模式(Factory Method)

工厂方法模式(Factory Method) 头号公社 文章目录 别名定义前言1、问题2、解决方案 结构适用场景实现方式优点缺点与其他模式的关系实例Reference 别名 虚拟构造函数(Virtual Constructor)。 定义 工厂方法是一种创建型设计模式…

前端需要注意和了解的SEO

SEO的基本了解 1.什么是SEO? SEO(Search Engine Optimization又叫做搜索引擎优化。是一种方式:利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。 2. 前端怎么理解SEO? 对于SEO引擎,在前端需要的是做出来的网站,页面…

从裸机启动开始运行一个C++程序(二)

先序文章请看: 从裸机启动开始运行一个C程序(一) 运行在8086上的第一个程序 既然硬件环境已经就绪了,那接下来,就要想办法让它运行我们的程序了。不过在此之前,我们必须要了解一下8086的主要架构&#xf…

小白安装 stabel diffusion 篇

windows 系统安装 stabel diffusion 软件的方法其实很简单,只有 4 步(安装过程遇到的报错问题,本文有详细的解决方案,都是我踩过的坑,给大家探路了): 1、安装 python(建议安装 3.10…

孙鑫VC++第五章 文本编程

目录 1. 插入符 1.1 创建文本插入符 1.2 创建图形插入符 2. 文字输出和OnDraw函数 2.1窗口重绘 2.2 添加字符串资源 3. 路径层和剪切区域 3.1 路径 3.2 裁剪区域 4. 字符输入 4.1 字符输入 5. 字幕变色功能的实现 5.1 设置字体 5.2字幕变色功能的实现 6. 总结 1…

windows11 安装WSL2全流程

文章目录 1、启用window子系统及虚拟化1.1 命令行方式1.2 使用图形界面 2、手动安装2.1、安装内核更新包2.2、设置默认WSL版本2.3、配置分发版本2.3.1 下载发行版本2.3.2 安装到C盘2.3.3 安装到D盘2.3.3.1 导出镜像2.3.3.2 导入镜像2.3.3.3 默认系统设置及多系统选择 3、自动安…

全景 I 0基础学习VR全景制作,第26章热点功能-文档

本期为大家带来蛙色VR平台,热点功能—文档功能操作。 功能位置示意 热点,指在全景作品中添加各种类型图标的按钮,引导用户通过按钮产生更多的交互,增加用户的多元化体验。 文档热点,即点击热点后会嵌入式弹出所选文档…

一次线上mysql 调优 ,join 的调优,索引优化(Block Nested Loop)

原因: 某接口调用十分缓慢,通过 Explain 发现是SQL问题 FROMorderInfo o LEFT JOIN orderDetail d ONo.orderCode d.orderCode LEFT JOIN user u ONo.userId u.userId LEFT JOIN product p ONd.productCode p.productCode LEFT JOIN adminUser au O…

Linux之打包压缩

1、参考 11-文件压缩与打包 linux tar压缩排除指定文件夹 2、打包与压缩 在windows上似乎打包和压缩是同一个东西,大家都明白你的意思,实际上是打包和压缩是两个过程,只不过常用zip压缩一站式解决了。 打包:就是将文件夹或多个…

《终身成长》笔记七——建设性的批评

目录 总结 经典摘录 我们能做什么 成长型思维模式与马上行动有异曲同工之妙 改变孩子的思维模式 两种思维模式对比 总结 《终身成长》是卡罗尔德韦克的代表作,在这部作品中,她以通俗易懂的笔触总结了自己对人类两种思维模式的研究。也许因为思维模…

mysq的约束学习

第13章_约束 1. 约束(constraint)概述 1.1 为什么需要约束 数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的…

鸿蒙Hi3861学习十五-Huawei LiteOS-M(Socket客户端)

一、简介 在网络编程的时候,不管是客户端还是服务端,都离不开Socket。那什么是Socket,这里做个简单介绍。详细的内容,可以参考这篇文章:WIFI学习一(socket介绍)_wifi socket_t_guest的博客-CSDN…

ChatGPT发展报告:原理、技术架构详解和产业未来(附下载)

今年12月1日,OpenAI推出人工智能聊天原型ChatGPT,再次赚足眼球,为AI界引发了类似AIGC让艺术家失业的大讨论。 据报道,ChatGPT在开放试用的短短几天,就吸引了超过 100 万互联网注册用户。并且社交网络流传出各种询问或…