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

news2024/12/28 21:03:30

面试题:说说你了解的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.coloradmin.cn/o/1907506.html

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

相关文章

你可以终止 forEach 吗?

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 理解 forEach JavaScript 的forEach方法是一种流行的数组迭代工具。它为每个数组元素执行一次提供的函数。但是&#xff0c;与传统的for 和 while循环不同&#xff0c;forEa…

深度学习-梯度下降算法-NLP(五)

梯度下降算法 深度学习中梯度下降算法简介找极小值问题数学上求最小值梯度梯度下降算法 找极小值问题在深度学习流程中深度学习整体流程图求解损失函数的目标权重的更新 深度学习中梯度下降算法简介 找极小值问题 引子&#xff1a; 我们训练一个人工智能模型&#xff0c;简单…

珍藏多年的计算机内核结构大全笔记,掌握计算机工作原理真不难

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

C++·栈和队列

栈和队列是什么看这里&#xff1a; 数据结构栈和队列-CSDN博客文章浏览阅读948次&#xff0c;点赞25次&#xff0c;收藏26次。本节讲解了栈和队列的内容&#xff0c;其核心就是栈的特点是后进先出&#xff0c;队列的特点是先进先出。并用C语言实现了栈和队列的结构以及它们的各…

ABAP注释快捷键修改(留着备用)

ABAP注释快捷键修改(留着备用) 在使用ABAP编辑器的时候&#xff0c;原有的添加代码注释和取消代码注释的快捷键未生效&#xff0c;这时我们可以考虑对注释快捷键进行修改 在事务码SE38(ABAP编辑器)屏幕右下角&#xff0c;点击【Options选项】图标 在【键盘】|【命令】输入栏中…

实战Qt开发WordBN笔记软件#01 搭建开发环境:VS2019+Qt6.5+CMake+Git

01 背景 【WordBN字远笔记】是天恩软件工作室开发的一款免费笔记软件&#xff1b;WordBN基于VS2019、Qt6.5开发&#xff0c;使用Qt Quick&#xff08;QML&#xff09;开发语言。 本课程将以【WordBN字远笔记】的界面为实战基础&#xff0c;详细介绍如何基于Qt/QML开发语言&am…

YOLOV8花朵实例分割实战

原文:YOLOV8花朵实例分割实战 - 知乎 (zhihu.com) 一、代码: https://github.com/ultralytics/ultralytics​github.com/ultralytics/ultralytics 与先前几个版本相比,YOLOv8 模型更快、更准确,同时为训练模型提供统一框架,以执行以下基本任务: 目标检测;实例分割;图…

pygame 音乐粒子特效

代码 import pygame import numpy as np import pymunk from pymunk import Vec2d import random import librosa import pydub# 初始化pygame pygame.init()# 创建屏幕 screen pygame.display.set_mode((1920*2-10, 1080*2-10)) clock pygame.time.Clock()# 加载音乐文件 a…

【微服务网关——https与http2代理实现】

1.https与http2代理 1.1 重新认识https与http2 https是http安全版本http2是一种传输协议两者并没有本质联系 1.1.1 https与http的区别 HTTP&#xff08;超文本传输协议&#xff09;和 HTTPS&#xff08;安全超文本传输协议&#xff09;是用于在网络上交换数据的两种协议。H…

基于DPU的云原生计算资源共池管理解决方案

1. 方案背景和挑战 在传统的云环境中&#xff0c;通常存在着不同的技术栈&#xff0c;支撑多样化的计算服务&#xff0c;具体如下&#xff1a; ① OpenStack环境与虚拟化云主机及裸金属服务 OpenStack是一个开源的云计算管理平台项目&#xff0c;它提供了部署和管理大规模计…

JAVA 代码块介绍

一、基本介绍 代码化块又称为初始化块&#xff0c;属于类中的成员[即 是类的一部分]&#xff0c;类似于方法&#xff0c;将逻辑语句封装在方法体中&#xff0c;通过包围起来。 但和方法不同&#xff0c;没有方法名&#xff0c;没有返回&#xff0c;没有参数&#xff0c;只有方…

人工智能的新时代:从模型到应用的转变

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

NLP 面试八股:“Transformers / LLM 的词表应该选多大?“ 学姐这么告诉我答案

NLP 面试八股&#xff1a;“Transformers / LLM 的词表应该选多大?" 学姐这么告诉我答案 原创 看图学 看图学 2024年07月03日 07:55 北京 题目&#xff1a; Transformers/大模型的 token vocabulary 应该选多大&#xff1f; 答案 先说一下结论&#xff1a; 数据量够大…

南航秋招指南,线上测评和线下考试

南航秋招简介 南航作为国内一流的航空公司&#xff0c;对人才的需求量非常旺盛&#xff0c;每年也有很多专业对口的工作提供给应届毕业生&#xff0c;对于应届毕业生而言&#xff0c;一定要抓住任何一个应聘机会&#xff0c;并且在规定的范围内进行简历的提交&#xff0c;以便…

为什么需要重写equals和如何重写equals

首先先看Java中的 &#xff0c;比较的两个对象的地址值。 如果是基本数据类型&#xff0c;那么就是比较的是值。 如果是引用数据类型&#xff0c;比较的就是地址. object类中的equals方法也是用的&#xff1b; 所以要比较两个对象的大小&#xff0c;去调用默认的equals方法…

鼠标宏怎么设置?6款鼠标自动点击器强推,游戏玩家专用!(2024全)

随着电子游戏和日常应用的不断发展&#xff0c;我们经常会遇到一些重复性的任务或操作。而在这种情况下&#xff0c;鼠标宏以其自动化的特点成为了许多玩家和使用者的利器之一。如果你正在寻找如何设置鼠标宏来简化操作并提高效率&#xff0c;那么你来对地方了。在本文中&#…

2024最新版若依-RuoYi-Vue3-PostgreSQL前后端分离项目部署手册教程

项目简介: RuoYi-Vue3-PostgreSQL 是一个基于 RuoYi-Vue3 框架并集成 PostgreSQL 数据库的项目。该项目提供了一套高效的前后端分离的开发解决方案&#xff0c;适用于中小型企业快速构建现代化的企业级应用。此项目结合了 RuoYi-Vue-Postgresql 和 RuoYi-Vue3 的优点&#xff0…

WEB06JavaScriptAjax

基础语法 引入方式 引入方式 内部脚本&#xff1a;将JS代码定义在HTML页面中 JavaScript代码必须位于<script></script>标签之间 在HTML文档中&#xff0c;可以在任意地方&#xff0c;放置任意数量的<script> 一般会把脚本置于<body>元素的底部&a…

matlab:对带参数a关于x的方程求解

题目 讲解 简洁对各个式子的内部含义用浅显易懂的话语总结出来了&#xff0c;耐心体会 f(a) (x)exp(x)x^ax^(sqrt(x))-100;%因为下面的fzero的第一个数需要一个fun&#xff0c;所以这里有两个句柄&#xff0c;第一个a是输入的&#xff0c;第二个x是需要被解出的 A0:0.1:2;%创…

提高生产效率和质量的六西格玛方法(优思学院)

想象一下&#xff0c;你被公司指派了一个重要项目&#xff0c;这家公司生产豪华汽车。当前&#xff0c;公司的生产数量正在下降&#xff0c;每天生产的汽车数量明显减少。此外&#xff0c;还存在安装在这些汽车上的雨刮器质量问题。你面临的挑战是找到解决方案&#xff0c;将生…