前端涨薪功法:无处不在的数组

130 阅读3分钟

什么是数组?

在计算机科学中,数组是一种由一组相同大小的元素(值或索引变量)组成,每个元素都由至少一个数组索引标识。

数组的存储方式使得每个元素的位置都可以通过数学公式从其索引中计算出来。

最简单的数据结构是线性数组,也称为一维数组。

例如,一个包含十个32位(4字节)整数变量的数组,索引从0到9,可以被存储为在内存地址2000、2004、2008等处的十个字,以便具有索引i的元素具有地址2000 +(i×4)。

image.png

数组的第一个元素的内存地址称为第一个地址、基础地址或基地址(也就是 i = 0的位置)。

javascript中的数组特性

JavaScript中的数组有以下优点:

  1. 简单易用:JavaScript中的数组非常容易创建和使用,只需要使用字面量或构造函数即可。
  2. 快速访问:由于JavaScript中的数组使用哈希表实现,因此访问数组元素的时间复杂度是O(1),非常快速。
  3. 内存连续:JavaScript中的数组是一段连续的内存空间,因此可以利用CPU缓存提高访问速度。
  4. 内置方法:JavaScript中的数组提供了很多内置方法,例如push、pop、shift、unshift等,可以方便地对数组进行操作

数组适用的场景

由于数组是由一串连续的空间组成的,访问数组的第n个元素时,是非常快速的,但删除或者添加元素时是相对低效的

取值搜索插入删除
O(1)O(1)O(n)O(n)

因为在处理数组的删除某个元素时,需要将后续的元素全部向前移动,效率比较低,从执行效率方面考虑,往往都不是真正的删除,例如 delete arr[i] i处的元素被置为空值而已,不自动其他元素

使用数组实现常见数据结构

数组作为一种常见的线性数据结构,可以用来实现许多其他数据结构,例如栈和队列。在本节中,我们将介绍如何使用数组来实现这些数据结构。

栈是一种后进先出(LIFO)的数据结构,其中元素只能从栈的顶部添加和删除。在JavaScript中,我们可以使用数组来实现栈。具体而言,我们可以使用数组的push()和pop()方法来实现栈的添加和删除操作。

例如,下面是一个使用数组实现栈的示例:

class Stack {
  constructor() {
    this.items = [];
  }
  
  push(element) {
    this.items.push(element);
  }

  pop() {
    return this.items.pop();
  }

  isEmpty() {
    return this.items.length === 0;
  }

  size() {
    return this.items.length;
  }

  peek() {
    return this.items[this.items.length - 1];
  }
}

在上面的代码中,我们创建了一个Stack类,该类使用数组来实现栈的功能。它包括push()方法用于添加元素,pop()方法用于删除元素,isEmpty()方法用于检查栈是否为空,size()方法用于返回栈的大小,以及peek()方法用于返回栈顶元素而不删除它。

  1. 队列

队列是一种先进先出(FIFO)的数据结构,其中元素只能从队列的尾部添加,从队列的头部删除。在JavaScript中,我们可以使用数组来实现队列。具体而言,我们可以使用数组的push()和shift()方法来实现队列的添加和删除操作。

以下是一个使用数组实现队列的示例:

class Queue {
  constructor() {
    this.items = [];
  }

  enqueue(element) {
    this.items.push(element);
  }

  dequeue() {
    return this.items.shift();
  }

  front() {
    return this.items[0];
  }

  isEmpty() {
    return this.items.length === 0;
  }

  size() {
    return this.items.length;
  }
}

在上面的代码中,我们创建了一个Queue类,该类使用数组来实现队列的功能。它包括enqueue()方法用于添加元素,dequeue()方法用于删除元素,front()方法用于返回队列头部元素,isEmpty()方法用于检查队列是否为空,以及size()方法用于返回队列的大小。