【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.mzph.cn/bicheng/43095.shtml

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

相关文章

青岛外贸建站公司wordpress网站模板

电子数码wordpress网站模板 电子数码wordpress网站模板&#xff0c;做数码电子的生产厂家或外贸公司官方网站模板。 https://www.jianzhanpress.com/?p3161 金属不锈钢wordpress外贸主题 适合从事金属不锈钢生产、加式或做外贸的公司&#xff0c;简洁wordpress外贸主题模板…

Linux走进网络

走进网络之网络解析 目录 走进网络之网络解析 一、认识计算机 1.计算机的发展 2.传输介质 3.客户端与服务器端的概念 交换机 路由器 二、计算机通信与协议 1. 协议的标准化 2. 数据包的传输过程 OSI 协议 ARP协议 3. TCP/IP:四层模型 4. TCP三次握手和四次挥手…

BUG: npm error `electron_mirror` is not a valid npm option

npm error electron_mirror is not a valid npm option 环境 windows 11 node v20.15.0 npm v10.7.0详情 在运行 npm run mirror 命令时出现错误。这是一个设置镜像的命令。 我是没事干了&#xff0c;运行这个命令&#xff0c;这个命令在我这里根本就是运行不了。这个命令一…

Vue2前端实现数据可视化大屏全局自适应 Vue实现所有页面自适应 Vue实现自适应所有屏幕

Vue自适应所有屏幕大小,目前页面自适应,尤其是数据可视化大屏的自适应更是案例很多 今天就记录一下使用Vue全局自适应各种屏幕大小的功能 在Vue.js中创建一个数据大屏,并使其能够自适应不同屏幕大小,通常涉及到布局的响应式设计、CSS媒体查询、以及利用Vue的事件系统来处理…

【matlab】【python】爬虫实战

目录 引言 具体步骤 1.设置请求选项 2.发送请求并获取响应 3.设置正则表达式 4.执行正则表达式匹配 matlab完整代码 python代码示例 引言 在当今这个信息爆炸的时代&#xff0c;数据已成为推动社会进步和企业发展的核心动力之一。随着互联网的普及和技术的飞速发展&am…

Why Can’t Robots Click The “I’m Not a Robot” Box On Websites?

Clicking a tiny box tells Google all they need to know about your humanity 你好,我是 Jiabcdefh。 if you’ve browsed the internet for any amount of time, you will likely come across a reCAPTCHA box. These boxes appear when you first enter certain websites…

RIP环境下的MGRE网络

首先将LSP的IP地址进行配置 其他端口也进行同样的配置 将serial3/0/1配置25.0.0.2 24 将serial4/0/0配置35.0.0.2 24 将GE0/0/0配置45.0.0.2 24 进行第二步 R1与R5之间使用ppp的pap认证 在R5中进行配置 在aaa空间中创建账号和密码 将这个账号和密码使用在ppp协议中 然后…

用XDR的思路保护API安全

云计算飞速发展的今天&#xff0c;越来越多应用程序已经转为选择云原生架构&#xff0c;这就少不了Serverless、微服务、API等技术的协助。 但同时也有越来越多的企业认识到&#xff0c;一定程度的“API安全”在整体安全与合规态势中发挥着至关重要的作用。然而&#xff0c;对…

【LLM】二、python调用本地的ollama部署的大模型

系列文章目录 往期文章&#xff1a; 【LLM】一、利用ollama本地部署大模型 目录 文章目录 前言 一、ollama库调用 二、langchain调用 三、requests调用 四、相关参数说明&#xff1a; 总结 前言 本地部署了大模型&#xff0c;下一步任务便是如何调用的问题&#xff0c…

2.硬盘和内存区别

2.2 磁盘比内存慢几万倍&#xff1f; 存储器方面的设备&#xff0c;分类比较多&#xff0c;那我们肯定不能只买一种存储器&#xff0c;比如你除了要买内存&#xff0c;还要买硬盘&#xff0c;而针对硬盘我们还可以选择是固态硬盘还是机械硬盘。 相信大家都知道内存和硬盘都属…

使用 Hugging Face 模型时遇到的问题

题意&#xff1a; I load a float32 Hugging Face model, cast it to float16, and save it. How can I load it as float16? 我加载了一个float32的Hugging Face模型&#xff0c;将其转换为float16&#xff0c;并保存了。我该如何以float16的形式加载它呢&#xff1f; 问题…

理解算法复杂度:时间复杂度详解

引言 在计算机科学中&#xff0c;算法复杂度是衡量算法效率的重要指标。时间复杂度和空间复杂度是算法复杂度的两个主要方面。在这篇博客中&#xff0c;我们将深入探讨时间复杂度&#xff0c;了解其定义、常见类型以及如何进行分析。 什么是时间复杂度&#xff1f; 时间复杂度…

昇思25天学习打卡营第4天|MindSpore数据集和数据变换

# 打卡 目录 # 打卡 Dateset&#xff1a;Pipeline 的起始 具体步骤 数据处理 Pipeline 代码例子 内置数据集的情况 自定义数据集的情况 可迭代的数据集 生成器 Transforms&#xff1a;数据预处理 代码例子 通用变换Compose 文本变换 Text Lambda变换 Dateset&…

【2024华为HCIP831 | 高级网络工程师之路】刷题日记(BGP)

个人名片:🪪 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️ 零基础学Java——小白入门必备🔥重识C语言——复习回顾🔥计算机网络体系———深度详讲HCIP数通工程师-刷题与实战🔥🔥

ubuntu22.04搭建mysql5.7

1.1 下载mysql安装包 MySQL下载地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) #下载wget https://cdn.mysql.com/archives/mysql-5.7/mysql-server_5.7.29-1ubuntu18.04_amd64.deb-bundle.tar#解压tar -xvf ./mysql-server_5.7.29-1ubuntu18…

bash: redi-cli: 未找到命令...

问题描述 在执行命令&#xff1a;redi-cli --bigkeys 提示&#xff1a;bash: redi-cli: 未找到命令... 确定服务器是否有Redis进程 ps -ef | grep redis查找Redis 文件信息 find / -name "redis-*"进入到当前目录 cd /usr/bin/再次执行命令 涉及redis-cli 连…

2.作业2

目录 1.作业题目 A图 B代码 2.css盒子模型 0.css盒子模型 1.外边距&#xff08;margin&#xff09; 2.边框&#xff08;border&#xff09; 3.内边距&#xff08;padding&#xff09; ​编辑 3.GET方法与POST方法的区别 学习产出&#xff1a; html的作业 1.作业题目 A图…

九科bit-Worker RPA 内容学习

简介&#xff1a; 什么是RPA&#xff1f; RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;本质上是一种“AI数字员工”&#xff0c;针对企业中存在的大批量、重复性、机械化人工操作&#xff0c;通过模拟人的工作流程使之实现自动化。 b…

Chrome 127内置AI大模型攻略

Chrome 127 集成Gemini:本地AI功能 Google将Gemini大模型整合进Chrome浏览器,带来全新免费的本地AI体验: 完全免费、无限制使用支持离线运行,摆脱网络依赖功能涵盖图像识别、自然语言处理、智能推荐等中国大陆需要借助魔法,懂都懂。 安装部署步骤: 1. Chrome V127 dev …

推出PSoC™ 车规级4100S Max系列,(CY8C4147LDE 和 CY8C4147LDS)支持性能更强大的第五代CAPSENSE™技术

推出全新车规级PSoC™ 4100S Max系列。这一微控制器器件系列具有更佳的闪存密度、通用输入输出接口&#xff08;GPIO&#xff09;、CAN-FD和硬件安全性&#xff0c;扩展了采用CAPSENSE™技术的汽车车身/暖通空调&#xff08;HVAC&#xff09;和方向盘应用人机界面&#xff08;H…