数据结构:数组

概述

  • 数组是一种线性数据结构 ,它将相同类型 的元素存储在连续的内存空间中。
  • 资料:https://pan.quark.cn/s/43d906ddfa1b

一、数组的核心特点

  1. 连续存储:元素在内存中紧密排列,相邻元素的地址连续。
  2. 随机访问 :通过索引(下标)可直接访问任意元素,时间复杂度为 O(1)
  3. 固定大小:数组在初始化时需要指定长度,一旦创建,大小通常不可变(静态数组)。
  4. 元素同构:所有元素必须是同一数据类型(如整数、字符串等)。

二、数组的基本操作

1. 访问元素

通过索引直接访问,索引从 0 开始(部分语言如 Lua 从 1 开始)。

java 复制代码
int[] arr = {1, 2, 3, 4};
int element = arr[2]; // 访问索引 2 的元素,结果为 3
2. 更新元素

通过索引修改对应位置的值。

java 复制代码
arr[2] = 5; // 将索引 2 的元素更新为 5,数组变为 [1, 2, 5, 4]
3. 插入元素
  • 头部插入 :需将所有元素向后移动一位,时间复杂度 O(n)
  • 中间插入 :需将插入位置后的元素向后移动,时间复杂度 O(n)
  • 尾部插入 :直接在末尾添加,时间复杂度 O(1)(若数组未满)。
4. 删除元素
  • 头部删除 :需将所有元素向前移动一位,时间复杂度 O(n)
  • 中间删除 :需将删除位置后的元素向前移动,时间复杂度 O(n)
  • 尾部删除 :直接移除末尾元素,时间复杂度 O(1)
5. 遍历数组

依次访问所有元素,时间复杂度 O(n)

java 复制代码
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}

三、数组的优缺点

优点
  • 随机访问效率高:通过索引直接定位元素,无需遍历。
  • 内存开销小:元素连续存储,无额外指针开销。
  • 实现简单:底层逻辑直观,易于理解和使用。
缺点
  • 大小固定:静态数组无法动态扩容,若元素数量超过数组长度会导致溢出。
  • 插入删除效率低:涉及元素移动,时间复杂度为 O(n)。
  • 空间浪费:若数组未填满,剩余空间无法利用。

四、数组的应用场景

  1. 需要快速访问元素的场景(如查找、排序算法)。
  2. 元素数量固定的场景(如存储一周的温度、学生的成绩等)。
  3. 底层数据结构(如哈希表、栈、队列的实现常依赖数组)。

五、数组的扩展(动态数组)

为解决静态数组大小固定的问题,许多语言提供了动态数组(如 Java 的 ArrayList、Python 的 list),其特点:

  • 支持动态扩容(通常扩容为原大小的 1.5 倍或 2 倍)。
  • 插入删除元素时自动调整容量,简化操作。
  • 牺牲部分空间换取灵活性,扩容时可能产生内存拷贝开销。

六、总结

数组是最基础的数据结构之一,核心优势是随机访问,适合处理元素数量固定且需要频繁查询的场景。若需频繁插入删除,建议使用链表等更高效的数据结构。

相关推荐
乌萨奇也要立志学C++1 小时前
【洛谷】BFS 求解最短路:从马的遍历到迷宫问题的实战解析
算法·宽度优先
老鼠只爱大米1 小时前
LeetCode经典算法面试题 #46:全排列(回溯、交换、剪枝等五种实现方案详细解析)
算法·leetcode·剪枝·回溯·全排列·stj算法
Dovis(誓平步青云)1 小时前
《滑动窗口算法:从 “暴力遍历” 到 “线性高效” 的思维跃迁》
运维·服务器·数据库·算法
_OP_CHEN2 小时前
【算法基础篇】(五十七)线性代数之矩阵乘法从入门到实战:手撕模板 + 真题详解
线性代数·算法·矩阵·蓝桥杯·c/c++·矩阵乘法·acm/icpc
天天爱吃肉82182 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车
im_AMBER2 小时前
Leetcode 114 链表中的下一个更大节点 | 删除排序链表中的重复元素 II
算法·leetcode
xhbaitxl2 小时前
算法学习day38-动态规划
学习·算法·动态规划
多恩Stone2 小时前
【3D AICG 系列-6】OmniPart 训练流程梳理
人工智能·pytorch·算法·3d·aigc
历程里程碑2 小时前
普通数组----轮转数组
java·数据结构·c++·算法·spring·leetcode·eclipse
pp起床2 小时前
贪心算法 | part02
算法·leetcode·贪心算法