数组还是队列?yocto-queue 源码告诉你

news/2024/4/27 11:51:47/文章来源:https://blog.csdn.net/web22050702/article/details/129169069

前言

昨天刚学完 omit 的源码,今天趁着学习源码的热度还没结束,来学习一下另一个我之前未接触过的东西 yocto-queue

yocto-queue 介绍

那么 yocto-queue 是什么呢?它有什么功能呢?查阅资料可得,对于数据比较多的数组,如果需要频繁地使用 pushshift 方法,那么可以使用 yocto-queue 来代替数组。因为shift 操作具有 O(n) 的时间复杂度,而通过 yocto-queue,只需要 O(1) 的时间复杂度。

说到 yocto-queue,不得不可以提到队列(毕竟名字中就带有 queue)。队列的工作原理是先进先出(FIFO),它是一个有序的元素列表,其中一个元素插入到队列的末尾,然后从队列的前面移除。

分析源码

介绍了它的一些基本信息,现在开始分析一下它们的源码部分。进入到 github,找到它的源码中的 package.json 部分,发现源码部分在 ./index.js 文件下。

我们进入到关键源码实现部分,代码不多,才六十多行,代码如下:

class Node {value;next;constructor(value) {this.value = value;}
}
export default class Queue { #head;#tail;#size;constructor() {this.clear();}enqueue(value) {const node = new Node(value);if (this.#head) {this.#tail.next = node;this.#tail = node;} else {this.#head = node;this.#tail = node;}this.#size++;}dequeue() {const current = this.#head;if (!current) {return;}		this.#head = this.#head.next;this.#size--;return current.value;}clear() {this.#head = undefined;this.#tail = undefined;this.#size = 0;}get size() {return this.#size;} * [Symbol.iterator]() {let current = this.#head;while (current) {yield current.value;current = current.next;}}
} 

Node

源码一开始就创建一个节点类 Node。节点里有两个属性, value 表示节点的值,next 是一个指向下一节点的指针,里面还有一个构造函数。

class Node {value;next;constructor(value) {this.value = value;}
} 

Queue

Queue 中,创建 headtail 头尾指针,并定义 size 来记录大小。每次遍历的时候先找到头结点,然后通过每个结点的 next 指针往后走。这样一看是不是又很像链表。

注:head 指向头节点,用于模拟 shift 来删除第一个元素;tail 指向尾节点,用于模拟 push 向末尾添加新元素。

clear

然后这里还定义了 clear 方法。如下所示:

 clear() {this.#head = undefined;this.#tail = undefined;this.#size = 0;
} 

clear 方法对实例的三个属性做了初始化。其中,把指针初始化为 undefined,表示一开始没有节点,将 size 初始化为0,表示是个空链表。

迭代器

这里的链表遍历使用了迭代器,采用了 [Symbol.iterator] 这个方法。之所以会用到这个方法来遍历,是为了让对象可迭代,而这个方法就可以达到此要求。

* [Symbol.iterator]() {let current = this.#head; while (current) { yield current.value; current = current.next;} 

使用 yocto-queue

看完源码后,我们来通过简单的练习更好地看清楚它发挥的作用。我创建了一个 react 项目,写了一个关于使用 yocto-queuedemo,代码如下所示:

import Queue from "./index";const queue = new Queue();
queue.enqueue("a");
queue.enqueue("b");
console.log(queue.dequeue());
console.log(...queue);
console.log(queue.size);
for (let q of queue) {console.log(q);
}
queue.clear();function App() {return (<div className="App"></div>)
}
export default App 

index 里面是 yocto-queue 源码,相当于引入 yocto-queue 包。然后分别调用了源码中的关键功能函数,并打印结果。

最终打印结果如下:

总结

以上就是我分享整个 yocto-queue 源码的过程。整体看下来代码其实并不长,但是作用却很大,非常实用。它既有数组的知识,又有队列的知识,也有链表的知识。关于数组的知识,可以看看我之前的这篇文章。

虽然目前我还没机会用到它,但是相信以后会有机会使用到它的。对于这个库,它的作用还是很大的。希望以后还能继续研究它。

最后

为大家准备了一个前端资料包。包含54本,2.57G的前端相关电子书,《前端面试宝典(附答案和解析)》,难点、重点知识视频教程(全套)。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第10天-商品服务(分层领域模型及规格参数编码实现)

1.分层领域模型规约 DO&#xff08; Data Object&#xff09;&#xff1a; 此对象与数据库表结构一一对应&#xff0c;通过 DAO 层向上传输数据源对象。DTO&#xff08; Data Transfer Object&#xff09;&#xff1a;数据传输对象&#xff0c; Service 或 Manager 向外传输的…

【Python】PaddleHub图像分类

目录 一、环境配置&#xff1a; 二、问题需求 三、实验内容 1、准备数据集 2、拆分数据集 3、载入数据集 4、生成数据读取器 5、配置策略 6、组建Finetune Task 7、开始Finetune 8、预测 四、总结&#xff1a; 一、环境配置&#xff1a; 线上环境&#xff1a; 飞桨…

JAVA线程入门简介

线程入门简介什么是程序?什么是进程?什么是线程&#xff1f;单线程与多线程并发与并行线程的使用用java查看有多少个cpu创建线程的两种方式继承Thread类&#xff0c;重写run方法实现Runnable接口&#xff0c;重写run方法多线程机制为社么是start?源码解析什么是程序? 是为完…

字符串转换为二进制-课后程序(JAVA基础案例教程-黑马程序员编著-第五章-课后作业)

【案例5-4】 字符串转换为二进制 【案例介绍】 1.任务描述 本例要求编写一个程序&#xff0c;从键盘录入一个字符串&#xff0c;将字符串转换为二进制数。在转换时&#xff0c;将字符串中的每个字符单独转换为一个二进制数&#xff0c;将所有二进制数连接起来进行输出。 案…

win10下 WSL2安装及配置

目录 一. Windows中WSL2&#xff08;子系统&#xff09;安装前提条件 二. Windows中WSL2&#xff08;子系统&#xff09;安装步骤&#xff08;默认安装C盘&#xff09; 选择包安装模式(选择到其他盘安装) 三. Windows中WSL2&#xff08;子系统&#xff09;设置默认root用户登…

35-Golang中的方法

Golang中的方法方法的介绍和使用方法的声明和调用方法的调用和传参机制原理方法的声明(定义)方法注意事项和细节讨论方法和函数的区别方法的介绍和使用 在某些情况下&#xff0c;我们需要声明(定义)方法。比如person结构体&#xff0c;除了有一些字段外(年龄&#xff0c;姓名……

Apollo规划模块代码学习(1): 算法架构原理、运行机制一文详解

文章目录 1、Apllo算法框架原理2、Apollo规划模块概述3、规划模块代码框架1、重要数据结构2、运行机制1、Apllo算法框架原理 Apollo开源自动驾驶平台中,高清地图模块提供了每个在线模块都可以访问的高清地图。感知和定位模块提供了必要的动态环境信息,可以在预测模块中进一步…

优思学院:六西格玛管理的优势有哪些?

六西格玛的优势有哪些呢&#xff1f;以下我们来探讨一下。 一・降低企业整体成本 对企业而言&#xff0c;不良品要么被废弃&#xff0c;要么需要重新加工&#xff0c;或者需要在客户现场维修或更换&#xff0c;这些都会增加企业成本。根据美国的统计数据&#xff0c;执行3σ管…

Socket编程 | TCP服务器 之 并发阻塞模型(多进程实现)

TCP服务器IO模型 之 并发阻塞 1. 引言 在 Linux 环境下多进程的应用很多,其中最主要的就是网络/客户服务器。多进程服务器是当客户有请求时,服务器用一个子进程来处理客户请求。父进程继续等待其它客户的请求。这种方法的优点是当客户有请求时,服务器能及时处理客户,特别是…

docker 部署centos7.9并打包成docker

下载centos基础镜像 docker pull centos:centos7 运行镜像 docker run -itd --name centos-test -p 60001:22 --privileged centos:centos7 /usr/sbin/init 进入容器 docker exec -it ebec90068696 /bin/bash 配置容器信息 安装ssh服务和网络必须软件 yum install net-to…

MongoDB在Windows、Linux、Docker环境下的安装

MongoDB在Windows、Linux、Docker环境下的安装DockerDocker安装远程连接WindowsWindows安装服务相关命令压缩包形式安装Mac、Ubuntu、Centos一键安装MacUbuntucentos源码安装使用Atlas免费MongoDB云数据库申请云数据库连接测试Docker Docker安装 拉取镜像 docker pull mongo…

洛谷P5736 【深基7.例2】质数筛 C语言/C++

【深基7.例2】质数筛 题目描述 输入 nnn 个不大于 10510^5105 的正整数。要求全部储存在数组中&#xff0c;去除掉不是质数的数字&#xff0c;依次输出剩余的质数。 输入格式 第一行输入一个正整数 nnn&#xff0c;表示整数个数。 第二行输入 nnn 个正整数 aia_iai​&…

数据结构与算法(二)(Python版)

数据结构与算法&#xff08;一&#xff09;&#xff08;Python版&#xff09; 文章目录递归动规初识递归&#xff1a;数列求和递归三定律递归的应用&#xff1a;任意进制转换递归的应用&#xff1a;斐波那契数列递归调用的实现分治策略与递归优化问题和贪心策略找零兑换问题贪心…

系列四、多表查询

一、多表关系 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结 构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种&#xff1a;一对多…

Sprng依赖注入(二):setter注入是如何工作的?

文章示例环境配置信息jdk版本:1.8开发工具&#xff1a;Intellij iDEA 2020.1springboot:2.3.9.RELEASE前言在Spring依赖注入&#xff08;一&#xff09;&#xff1a;字段注入的方式是如何工作的&#xff1f;中主要分享了Spring bean依赖注入方式中的字段注入方式及其工作过程&a…

基于Pytorch,从头开始实现Transformer(编码器部分)

Transformer理论部分参考知乎上的这篇文章 Transformer的Attention和Masked Attention部分参考知乎上的这篇文章 Transformer代码实现参考这篇文章&#xff0c;不过这篇文章多头注意力实现部分是错误的&#xff0c;需要注意。 完整代码放到github上了&#xff0c;链接 Trans…

联想小新 Air-14 2019IML电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。硬件型号驱动情况主板Lenovo LNVNB161216处理器Intel Core i5-10210U / i7-10510U已驱动内存8GB DDR4 2666已驱动硬盘康佳KAK0500B128(128 GB/固志硬盘)已驱动显卡Intel UHD 620Nvidia GeForce MX250(屏蔽)无法驱动声卡Cone…

轮播图、阅读注册协议、网页时钟、随机点名、小米搜索框、轮播图点击切换——web APIs练习

目录 一、获取元素&#xff08;DOM&#xff09; 1. 随机轮播图案例 2. 阅读注册协议&#xff08;定时器间歇函数的应用&#xff09; 3. 轮播图定时器版 4. 网页时钟 二、事件基础&#xff08;DOM&#xff09; 1. 随机点名案例 2. 轮播图点击切换&#xff08;重点&#…

【计算机网络 -- 期末复习】

例题讲解 IP地址&#xff08;必考知识点&#xff09; 子网掩码 子网划分 第一栗&#xff1a; 子网划分题目的答案一般不唯一&#xff0c;我们主要采用下方的写法&#xff1a; 第二栗&#xff1a; 路由跳转 数据传输 CSMA/CD数据传输 2、比特率与波特率转换 四相位表示&am…

ElasticSearch 学习笔记总结(一)

文章目录一、 数据的 分类二、 ElasticSearch 介绍三、 ElasticSearch 搭建四、正排索引 和 倒排索引五、ES HTTP 索引 操作六、ES HTTP 文档 操作七、ES HTTP 查询数据1. 条件查询2. 分页查询3. 排序查询4. 多条件查询5. 全文检索 完全匹配 高亮显示6. 聚合查询八、 ES HTTP 映…