前端线性数据结构
线性数据结构将元素按顺序排列。每个元素都有一个前驱和一个后继。
Arrays 数组是 JavaScript 中的主要工具。它们使用连续内存。这使得你可以通过索引立即访问任何元素。
- push: 在末尾添加一个元素。
- unshift: 在开头添加一个元素。这很慢,因为其他所有元素都必须向右移动一个位置。
- splice: 在任意位置添加或删除元素。此方法会改变原数组。它不是一个纯函数。
Note: 当数组变得过大时,JavaScript 必须分配更大的内存块并进行复制。这会消耗性能。
Stacks 栈遵循 LIFO 原则:后进先出(Last In, First Out)。可以想象成一叠盘子。你只能从顶部添加或移除。
- push: 添加到顶部。
- pop: 从顶部移除。
- peek: 查看顶部元素而不将其移除。
Queues 队列遵循 FIFO 原则:先进先出(First In, First Out)。可以想象成商店排队。
- push: 添加到末尾。
- shift: 从开头移除。
Warning: 对于大型数据集,在数组上使用 shift 会很慢。每个元素都必须向左移动以填补空隙。对于高吞吐量数据,请改用链表。
Linked Lists 链表由节点组成。每个节点包含数据和指向下一个节点的指针。
- Advantages: 一旦找到位置,添加或删除节点非常快。你只需要更改指针。
- Disadvantages: 你无法直接跳转到某个索引。你必须从头节点(head)开始,逐个跟随指针。这很慢。
Comparison Summary:
- Arrays: 最适合频繁读取和少量数据。访问复杂度为 O(1)。
- Linked Lists: 最适合频繁写入和大量数据。如果你已经拥有该节点,插入复杂度为 O(1)。
Pro Tips for JavaScript:
- 不要在一个数组中混合使用不同的数据类型。保持类型统一有助于引擎使用连续内存。
- 对数字进行排序时,务必使用比较函数。
[10, 2].sort()的结果是[10, 2],因为它按字符串进行排序。 - 请记住,大多数原生数组方法都会修改原数组。