【js面试题】js的数据结构

面试题:说说你了解的js数据结构

JavaScript中的数据结构是编程的基础,它们帮助我们以高效的方式存储和操作数据。
下面将详细介绍
在这里插入图片描述

这些数据结构的来源、概念和应用场景。

数组 Array

来源: 数组是一种线性数据结构,起源于计算机科学的早期,用于存储一系列的元素。
概念: 数组是具有相同数据类型的一组有序元素的集合,可以通过索引快速访问每个元素。
应用场景: 数组适用于需要快速访问元素的场景,如列表、矩阵等。

数组是最基本的数据结构,它使用一块连续的内存空间保存数据,保存的数据的个数在分配内存的时候是确定的

let users = [{ id: 1, name: "Alice", age: 25 },{ id: 2, name: "Bob", age: 30 },{ id: 3, name: "Charlie", age: 22 }
];// 访问第一个用户
console.log(users[0]); // { id: 1, name: "Alice", age: 25 }

栈 Stack

来源: 栈的概念来源于计算机科学中的抽象数据类型,用于模拟现实世界中堆叠物品的行为。
概念: 栈是一种后进先出(LIFO)的数据结构,只允许在栈顶进行添加(push)和移除(pop)操作。
应用场景: 栈适用于需要后进先出操作的场景,如浏览器的前进和后退功能、函数调用栈等。

在栈里,新元素都接近栈顶,旧元素都接近栈底 每次加入新的元素和拿走元素都在顶部操作
在这里插入图片描述

场景: 实现一个简单的撤销功能。


class Stack {constructor() {this.items = [];}push(item) {this.items.push(item);}pop() {return this.items.pop();}
}let undoStack = new Stack();
undoStack.push("第一步操作");
undoStack.push("第二步操作");// 撤销操作
console.log(undoStack.pop()); // "第二步操作"

队列

来源: 队列的概念同样起源于计算机科学,用于模拟现实世界中的排队行为。
概念: 队列是一种先进先出(FIFO)的数据结构,只允许在队尾添加元素,在队首移除元素。
应用场景: 队列适用于需要先进先出操作的场景,如任务调度、缓冲处理等。
在这里插入图片描述

场景: 实现一个简单的任务队列。

class Queue {constructor() {this.items = [];}enqueue(item) {this.items.push(item);}dequeue() {return this.items.shift();}
}let taskQueue = new Queue();
taskQueue.enqueue("任务1");
taskQueue.enqueue("任务2");// 执行任务
console.log(taskQueue.dequeue()); // "任务1"

链表

来源: 链表的概念起源于计算机科学,用于解决数组在插入和删除操作时效率低下的问题。
概念: 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
应用场景: 链表适用于频繁插入和删除操作的场景,如实现哈希表、LRU缓存等。
场景: 实现一个简单的链表结构。

class ListNode {constructor(value) {this.value = value;this.next = null;}
}class LinkedList {constructor() {this.head = null;}append(value) {let newNode = new ListNode(value);if (!this.head) {this.head = newNode;return;}let current = this.head;while (current.next) {current = current.next;}current.next = newNode;}
}let list = new LinkedList();
list.append(1);
list.append(2);// 输出链表
console.log(list); // ListNode { value: 1, next: ListNode { value: 2, next: null } }

字典

来源: 字典的概念起源于现实世界中的字典,用于存储键值对。
概念: 字典是一种存储键值对的数据结构,允许通过键快速访问对应的值。
应用场景: 字典适用于需要通过键快速查找值的场景,如实现映射、缓存等。
场景: 存储和检索键值对。

let dictionary = new Map();
dictionary.set("name", "Alice");
dictionary.set("age", 25);// 获取值
console.log(dictionary.get("name")); // "Alice"

散列表

来源: 散列表(哈希表)的概念起源于计算机科学,用于实现快速的键值对存储和检索。
概念: 散列表是一种通过哈希函数将键映射到数组索引的数据结构,以实现快速的查找和插入。
应用场景: 散列表适用于需要快速键值对操作的场景,如数据库索引、缓存等。
场景: 实现一个简单的缓存机制。

class HashTable {constructor(size) {this.buckets = new Array(size);this.size = size;}hash(key) {let hash = 0;for (let i = 0; i < key.length; i++) {hash = (hash + key.charCodeAt(i)) % this.size;}return hash;}set(key, value) {let index = this.hash(key);if (!this.buckets[index]) {this.buckets[index] = [];}this.buckets[index].push([key, value]);}get(key) {let index = this.hash(key);let bucket = this.buckets[index];if (bucket) {for (let i = 0; i < bucket.length; i++) {if (bucket[i][0] === key) {return bucket[i][1];}}}return undefined;}
}let hashTable = new HashTable(10);
hashTable.set("name", "Alice");
hashTable.set("age", 25);// 获取值
console.log(hashTable.get("name")); // "Alice"

来源: 树的概念起源于计算机科学中的抽象数据类型,用于模拟具有层级关系的数据。
概念: 树是一种非线性数据结构,由节点组成,每个节点可以有多个子节点,但只有一个父节点(根节点除外)。
应用场景: 树适用于表示具有层级关系的数据,如文件系统、组织结构图等。
场景: 实现一个简单的文件系统。

class TreeNode {constructor(value) {this.value = value;this.children = [];}
}let root = new TreeNode("root");
let child1 = new TreeNode("child1");
let child2 = new TreeNode("child2");root.children.push(child1);
root.children.push(child2);// 输出树结构
console.log(root); // TreeNode { value: "root", children: [TreeNode, TreeNode] }

来源: 图的概念起源于数学,用于表示对象之间的关系。
概念: 图是一种由节点(顶点)和连接节点的边组成的非线性数据结构,可以是有向图或无向图。
应用场景: 图适用于表示复杂的关系网络,如社交网络、地图导航等。
场景: 实现一个简单的社交网络。

class Graph {constructor() {this.adjacencyList = new Map();}addVertex(vertex) {if (!this.adjacencyList.has(vertex)) {this.adjacencyList.set(vertex, []);}}addEdge(source, destination) {if (this.adjacencyList.has(source) && this.adjacencyList.has(destination)) {this.adjacencyList.get(source).push(destination);this.adjacencyList.get(destination).push(source);}}
}let graph = new Graph();
graph.addVertex("Alice");
graph.addVertex("Bob");
graph.addEdge("Alice", "Bob");// 输出图结构
console.log(graph.adjacencyList); // Map(2) {"Alice" => ["Bob"], "Bob" => ["Alice"]}

来源: 堆的概念起源于计算机科学,用于实现优先队列。
概念: 堆是一种特殊的完全二叉树,满足堆属性:每个节点的值都大于或等于(最大堆)或小于或等于(最小堆)其子节点的值。
应用场景: 堆适用于需要快速访问最大或最小元素的场景,如优先队列、堆排序等。

以上数据结构在JavaScript中都有实现,它们在不同的场景下发挥着各自的作用,帮助开发者高效地解决问题。理解这些数据结构的概念和应用场景对于编写高效、可维护的代码至关重要。
场景: 实现一个优先队列。

class MaxHeap {constructor() {this.heap = [];}insert(value) {this.heap.push(value);this.bubbleUp();}bubbleUp() {let index = this.heap.length - 1;const element = this.heap[index];while (index > 0) {let parentIndex = Math.floor((index - 1) / 2);let parent = this.heap[parentIndex];if (element <= parent) break;this.heap[index] = parent;this.heap[parentIndex] = element;index = parentIndex;}}extractMax() {const max = this.heap[0];const end = this.heap.pop();if (this.heap.length > 0) {this.heap[0] = end;this.bubbleDown();}return max;}bubbleDown() {let index = 0;const length = this.heap.length;const element = this.heap[0];while (true) {let leftChildIndex = 2 * index + 1;let rightChildIndex = 2 * index + 2;let leftChild, rightChild;let swap = null;if (leftChildIndex < length) {leftChild = this.heap[leftChildIndex];if (leftChild > element) {swap = leftChildIndex;}}if (rightChildIndex < length) {rightChild = this.heap[rightChildIndex];if ((swap === null && rightChild > element) ||(swap !== null && rightChild > leftChild)) {swap = rightChildIndex;}}if (swap === null) break;this.heap[index] = this.heap[swap];this.heap[swap] = element;index = swap;}}
}let maxHeap = new MaxHeap();
maxHeap.insert(10);
maxHeap.insert(20);
maxHeap.insert(5);// 获取最大值
console.log(maxHeap.extractMax()); // 20

这些数据结构在实际开发中非常有用,能够帮助我们更高效地解决问题。

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

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

相关文章

卷积神经网络可视化的探索

文章目录 训练LeNet模型下载FashionMNIST数据训练保存模型 卷积神经网络可视化加载模型一个测试图像不同层对图像处理的可视化第一个卷积层的处理第二个卷积层的处理 卷积神经网络是利用图像空间结构的一种深度学习网络架构&#xff0c;图像在经过卷积层、激活层、池化层、全连…

PyJWT,一个基于JSON的轻量级安全通信方式的python库

目录 什么是JWT&#xff1f; JWT的构成 PyJWT库简介 安装PyJWT 生成JWT 验证JWT 使用PyJWT的高级功能 自定义Claims 错误处理 结语 什么是JWT&#xff1f; 在介绍PyJWT这个Python库之前&#xff0c;我们首先需要了解什么是JWT。JWT&#xff0c;全称JSON Web Token&am…

Java根据经纬度获取两点之间的距离

Java根据经纬度获取两点之间的距离&#xff0c;最近在实现类似于钉钉打卡签到的需求&#xff0c;因为对精度要求不是很高&#xff0c;所以可以通过一个球面距离的公式来求两点距离&#xff0c;这里将地球当成一个球体&#xff0c;实际上地球是一个不规则的球体&#xff0c;所以…

HttpServer内存马

HttpServer内存马 基础知识 一些基础的方法和类 HttpServer&#xff1a;HttpServer主要是通过带参的create方法来创建&#xff0c;第一个参数InetSocketAddress表示绑定的ip地址和端口号。第二个参数为int类型&#xff0c;表示允许排队的最大TCP连接数&#xff0c;如果该值小…

Xilinx FPGA DDR4 接口的 PCB 准则

目录 1. 简介 1.1 FPGA-MIG 与 DDR4 介绍 1.2 DDR4 信号介绍 1.2.1 Clock Signals 1.2.2 Address and Command Signals 1.2.3 Address and Command Signals 1.2.4 Data Signals 1.2.5 Other Signals 2. 通用存储器布线准则 3. Xilinx FPGA-MIG 的 PCB 准则 3.1 引脚…

【Excel】 批量跳转图片

目录标题 1. CtrlA全选图片 → 右键 → 大小和属性2. 取消 锁定纵横比 → 跳转高度宽度 → 关闭窗口3. 最后一图拉到最后一单元格 → Alt吸附边框![](https://i-blog.csdnimg.cn/direct/d56ac1f41af54d54bb8c68339b558dd1.png)4. CtrlA全选图片 → 对齐 → 左对齐 → 纵向分布!…

uniapp实现一个键盘功能

前言 因为公司需要&#xff0c;所以我.... 演示 代码 键盘组件代码 <template><view class"keyboard_container"><view class"li" v-for"(item, index) in arr" :key"index" click"changArr(item)" :sty…

Linux的前世今生

Unix的起源和发展 1969年&#xff0c;AT&T贝尔实验室的Ken Thompson和Dennis Ritchie等人开发了Unix操作系统。Unix的设计理念强调小而简洁的工具&#xff0c;文本流和系统模块化&#xff0c;这些理念后来成为Linux开发的重要基础。1973年&#xff0c;Unix用C语言重新编写…

收银系统源码-营销活动-幸运抽奖

1. 功能描述 营运抽奖&#xff1a;智慧新零售收银系统&#xff0c;线上商城营销插件&#xff0c;商户/门店在小程序商城上设置抽奖活动&#xff0c;中奖人员可内定&#xff1b; 2.适用场景 新店开业、门店周年庆、节假日等特定时间促销&#xff1b;会员拉新&#xff0c;需会…

DDR3 (四)

1 DDR3 8倍预取 DDR3相比DDR2外部IO时钟又提高了一倍&#xff0c;因此DDR3外部IO时钟是内核时钟的4倍&#xff0c;再加上双沿采样&#xff0c;因此DDR3可以实现8倍预取 2 DDR3 芯片位宽 DDR3使用8倍预取技术&#xff0c;指的是芯片位宽&#xff08;DQ数据线位宽&#xff09…

逻辑回归模型(非回归问题,而是分类问题)

目录&#xff1a; 一、Sigmoid函数&#xff1a;二、逻辑回归介绍&#xff1a;三、决策边界四、逻辑回归模型训练过程&#xff1a;1.训练目标&#xff1a;2.梯度下降调整参数&#xff1a; 一、Sigmoid函数&#xff1a; Sigmoid函数是构建逻辑回归模型的重要函数&#xff0c;如下…

探展2024世界人工智能大会之令人惊艳的扫描黑科技~

文章目录 ⭐️ 前言⭐️ AIGC古籍修复文化遗产焕新⭐️ 高效的文档图像处理解决方案⭐️ AIGC扫描黑科技一键全搞定⭐️ 行业级的知识库大模型加速器⭐️ 结语 ⭐️ 前言 大家好&#xff0c;我是 哈哥&#xff08;哈哥撩编程&#xff09;&#xff0c;这次非常荣幸受邀作为专业…

Linux中的粘滞位及mysql日期函数

只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写 权限. 为了解决这个不科学的问题, Linux引入了粘滞位的概念. 粘滞位 当一个目录被设置为"粘滞位"(用chmod t),则该目录下的文件只能由 一、超级管理员删除 二、该目录…

回归损失和分类损失

回归损失和分类损失是机器学习模型训练过程中常用的两类损失函数&#xff0c;分别适用于回归任务和分类任务。 回归损失函数 回归任务的目标是预测一个连续值&#xff0c;因此回归损失函数衡量预测值与真实值之间的差异。常见的回归损失函数有&#xff1a; 均方误差&#xff…

匈牙利汽车市场研究报告(2024版)

匈牙利加入欧盟后成为欧洲国家的汽车制造组装基地和大型跨国企业的零部件供应商&#xff0c;具有深厚的汽车工业基础。在欧债危机后&#xff0c;匈牙利政府提出“向东发展”战略&#xff0c;并将电动化作为汽车行业新的发展方向&#xff0c;通过一系列外资友好政策吸引中日韩等…

数据泄露态势(2024年5月)

监控说明&#xff1a;以下数据由零零信安0.zone安全开源情报系统提供&#xff0c;该系统监控范围包括约10万个明网、深网、暗网、匿名社交社群威胁源。在进行抽样事件分析时&#xff0c;涉及到我国的数据不会选取任何政府、安全与公共事务的事件进行分析。如遇到影响较大的伪造…

RxJava学习记录

文章目录 1. 总览1.1 基本原理1.2 导入包和依赖 2. 操作符2.1 创建操作符2.2 转换操作符2.3 组合操作符2.4 功能操作符 1. 总览 1.1 基本原理 参考文献 构建流&#xff1a;每一步操作都会生成一个新的Observable节点(没错&#xff0c;包括ObserveOn和SubscribeOn线程变换操作…

【零基础】学JS之APIS(基于黑马)

喝下这碗鸡汤 披盔戴甲,一路勇往直前! 1. 什么是事件 事件是在编程时系统内发生的动作或者发生的事情 比如用户在网页上单击一个按钮 2. 什么是事件监听? 就是让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立即调用一个函数做出响应&#xff0c;也称为 注…

详解Java垃圾回收(GC)机制

一、为什么需要垃圾回收 如果不进行垃圾回收&#xff0c;内存迟早都会被消耗空&#xff0c;因为我们在不断的分配内存空间而不进行回收。除非内存无限大&#xff0c;我们可以任性的分配而不回收&#xff0c;但是事实并非如此。所以&#xff0c;垃圾回收是必须的。 二、哪些内…

【Selenium配置】WebDriver安装浏览器驱动(ChromeEdge)

【Selenium配置】WebDriver安装浏览器驱动&#xff08;Chrome&Edge&#xff09; 文章目录 【Selenium配置】WebDriver安装浏览器驱动&#xff08;Chrome&Edge&#xff09;Chrome确认Chrome版本下载对应driver把解压后的chromedriver文件放在chrome安装目录下&#xff0…