二维数组是什么
二维数组可以看作一个表格,比如 Excel 工作表或教室座位表。它有行和列,每个格子存放一个数据。在编程中,二维数组本质上是数组的数组:一个一维数组,它的每个元素又是一个一维数组。例如 int matrix[3][4] 表示有 3 行、每行有 4 个整数的表格。
行列下标 a[i][j] 与内存布局
要访问第 i 行第 j 列的元素,使用 a[i][j]。下标通常从 0 开始,所以 a[0][0] 是第一个元素。在内存中,二维数组是按行连续存储的:先存第 0 行的所有列,再存第 1 行,以此类推。这种布局使得行内元素在内存中相邻,访问效率高。
遍历方式:行优先/列优先/对角线
- 行优先:外层循环行 i,内层循环列 j。按行顺序访问,符合内存布局,缓存友好。
- 列优先:外层循环列 j,内层循环行 i。跳着访问内存,可能引起缓存不命中,效率较低。
- 对角线:i 和 j 同时变化,如 i=j 的主对角线。常用于矩阵运算。
常见操作复杂度
| 操作 | 时间复杂度 | 说明 |
|---|---|---|
| 访问 a[i][j] | O(1) | 直接计算地址 |
| 修改 a[i][j] | O(1) | 同访问 |
| 遍历所有元素 | O(m×n) | m 行 n 列 |
| 按行求和 | O(m×n) | 需遍历每个元素 |
| 矩阵转置 | O(m×n) | 需复制到新数组 |
典型应用:网格/图/DP 表
- 网格:如棋盘、像素图像、地图,用二维数组表示每个位置的状态。
- 图:邻接矩阵表示图中顶点之间的连接关系,
graph[i][j]为 1 表示有边。 - DP 表:动态规划中常用二维数组存储子问题结果,如背包问题、最长公共子序列。