JavaScript中一些的数据结构和算法

JavaScript中的数据结构和算法

JavaScript是一门弱类型语言,但是它提供了很多内置的数据结构和算法,这使得它可以处理各种各样的问题。在本文中,我们将详细介绍JavaScript中的数据结构和算法。

一、数组

数组是JavaScript中最基本的数据结构之一。它是一组有序的数据集合,可以通过索引来访问和修改其中的元素。

1. 创建数组

我们可以使用Array构造函数或数组字面量来创建一个数组。

// 使用Array构造函数
let arr1 = new Array(1, 2, 3);
console.log(arr1); // [1, 2, 3]

// 使用数组字面量
let arr2 = [4, 5, 6];
console.log(arr2); // [4, 5, 6]

2. 访问数组元素

可以使用索引来访问数组中的元素,索引从0开始,直到数组的长度减1。

let arr = [1, 2, 3];
console.log(arr[0]); // 1
console.log(arr[1]); // 2
console.log(arr[2]); // 3

3. 修改数组元素

可以通过索引来修改数组中的元素。

let arr = [1, 2, 3];
arr[0] = 4;
console.log(arr); // [4, 2, 3]

4. 数组的常用方法

JavaScript提供了许多用于操作数组的方法,下面是其中的一些常用方法:

- push():将一个或多个元素添加到数组的末尾,并返回新的长度。
- pop():删除数组的最后一个元素,并返回被删除的元素。
- shift():删除数组的第一个元素,并返回被删除的元素。
- unshift():将一个或多个元素添加到数组的开头,并返回新的长度。
- splice():在数组中添加或删除元素,可以用于删除、替换、插入元素。
- slice():返回数组的一个片段,可以通过指定起始和结束索引来指定片段的范围。
- concat():将两个或多个数组合并为一个新数组,并返回新数组。
- join():将数组中的所有元素连接成一个字符串。

二、栈和队列

栈和队列是两种最基本的数据结构之一。它们都是一组有序的数据集合,可以用于存储和操作数据。

1. 栈

栈是一种后进先出(Last-In-First-Out,LIFO)的数据结构。它可以看作是一个桶,数据从桶的一端进入,从另一端出去。在JavaScript中,我们可以使用数组来实现栈。

下面是一些常用的栈操作:

- push():将一个元素添加到栈的顶部。
- pop():从栈的顶部删除一个元素,并返回被删除的元素。
- peek():返回栈顶的元素,但不删除该元素。

7.哈希表(Hash Table)

哈希表是一种利用哈希函数(Hash Function)实现快速查找的数据结构,它通过把关键字映射到哈希表中的一个位置来进行查找。

在 JavaScript 中,可以使用对象(Object)来实现哈希表的功能,因为对象本质上就是一种键值对(Key-Value)的集合,它利用对象的属性名(Key)来实现快速查找。
 

哈希表(Hash Table),也叫散列表,是一种根据关键码值(Key-Value)直接进行访问的数据结构。通过将关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫作散列函数(Hash Function),存放记录的数组叫作哈希表。

哈希表的基本操作包括插入、删除和查找,插入、删除和查找的平均时间复杂度都是 O(1),极端情况下会退化到 O(n)。

哈希表的实现有多种方式,比较常见的是使用数组加链表或数组加红黑树。

示例代码:

// 创建哈希表 class HashTable { constructor() { this.table = new Array(137); this.buildChains(); }

// 散列函数 hash(string) { const H = 37; let total = 0; for (let i = 0; i < string.length; i++) { total += H * total + string.charCodeAt(i); } total %= this.table.length; if (total < 0) { total += this.table.length - 1; } return parseInt(total); }

// 构建链表 buildChains() { for (let i = 0; i < this.table.length; i++) { this.table[i] = new LinkedList(); } }

// 插入数据 put(key, value) { const pos = this.hash(key); this.table[pos].append(new ValuePair(key, value)); }

// 获取数据 get(key) { const pos = this.hash(key); const linkedList = this.table[pos]; let current = linkedList.getHead(); while (current.next) { if (current.element.key === key) { return current.element.value; } current = current.next; } if (current.element.key === key) { return current.element.value; } return undefined; }

// 删除数据 remove(key) { const pos = this.hash(key); const linkedList = this.table[pos]; let current = linkedList.getHead(); while (current.next) { if (current.element.key === key) { linkedList.remove(current.element); if (linkedList.isEmpty()) { this.table[pos] = undefined; } return true; } current = current.next; } if (current.element.key === key) { linkedList.remove(current.element); if (linkedList.isEmpty()) { this.table[pos] = undefined; } return true; } return false; } }

// 创建链表 class LinkedList { constructor() { this.head = new Node("head"); }

// 查找节点 find(item) { let currNode = this.head; while (currNode.element != item) { currNode = currNode.next; } return currNode; }

// 插入节点 insert(newElement, item) { const newNode = new Node(newElement); const current = this.find(item); newNode.next = current.next; current.next = newNode; }

// 显示链表

8. 图(Graph)

图是由一组节点和一组边组成的数据结构,它可以用来表示现实世界中的各种复杂关系。

在 JavaScript 中,可以使用邻接表(Adjacency List)或邻接矩阵(Adjacency Matrix)来表示图的结构。邻接表适合表示稀疏图,而邻接矩阵适合表示稠密图。

常见的图算法包括深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法、最小生成树算法等。

9. 排序算法

排序算法是将一组数据按照某种规则进行排列的算法,它是算法中的基础,也是面试中经常涉及的知识点。

常见的排序算法包括冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序等。每种排序算法的时间复杂度和空间复杂度不同,选择合适的算法对于提高程序的性能至关重要。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图灵软件技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值