• ④ 数据结构之“队列”


    一、 理论

    1. 队列简介

    • 一个 先进先出 的数据结构
    • js中没有队列,但可以用Array实现队列的所有功能
    // queue
    const queue = []
    queue.push(1)
    queue.push(2)
    let item1 = queue.shift()
    let item2 = queue.shift()
    

    2. 队列的应用场景

    • 需要 先进先出 的场景

    2.1 食堂排队打饭

    • 食堂只有一个窗口
    • 先进先出,保证有序

    2.2 js异步中的任务队列

    • js是单线程,无法同时处理异步中的并发任务
    • 使用任务队列先后处理异步任务

    2.3 计算最近请求次数

    • 有新请求就入队,3000ms前发出的请求出队

    二、刷题

    1. 最近的请求次数(933)

    1.1 题目描述

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

    • 请你实现 RecentCounter 类:

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

    1.2 解题思路

    输入:inputs = [[], [1], [100], [3001], [3002]]
    输出:[null, 1, 2, 3, 3]

    • 越早发出的请求越早不在最近3000ms内的请求里
    • 满足先进先出,使用队列

    1.3 解题步骤

    • 有新请求则入队,3000ms前发出的则出队
    • 返回队列的长度
    class RecentCounter {
      constructor() {
        this.q = []
      }
      ping(t) {
        this.q.push(t)
        while(this.q[0] < t - 3000) {
          this.q.shift()
        }
        return this.q.length
      }
    } 
    

    1.4 时间复杂度&空间复杂度

    • 时间复杂度:O(n)
    • 空间复杂度:O(n)

    2. js异步中的任务队列(前端与队列)

    setTimeout(() => {
      console.log(1)
    }, 0)
    console.log(2)
    
    • 事件循环与任务队列

    三、总结 -- 技术要点

    • 队列是一个先进先出的数据结构
    • js中没有队列,但可以用Array实现队列的所有功能
    • 队列的常用操作:push shift queue[0]

    四、思考题

    1. 实现queue类

    class Queue {
      constructor() {
        this.q = []
      }
      push(c) {
        this.q.push(c)
      }
      shift() {
        this.q.shift()
      }
      peek() {
        return this.q[0]
      }
    }
    
  • 相关阅读:
    C知识(#一些笔记)
    我整理的Python规则(2)
    我整理的Python代码规则
    教你如何通俗易懂的了解深度学习知识
    c#中委托和事件(续)(转)
    c#中的委托和事件(转)
    .Net neatupload上传控件实现文件上传的进度条
    C#常用日期格式处理转换[C#日期格式转换大全
    C#string常用函数总结
    数据库08版本如何移动到05的数据中
  • 原文地址:https://www.cnblogs.com/pleaseAnswer/p/15816489.html
Copyright © 2020-2023  润新知