跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
数组基础
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= 数组基础 = '''数组'''(Array)是最基础且广泛使用的线性数据结构,它在内存中用'''连续的空间'''存储'''相同类型'''的元素集合,并通过从0开始的'''数字索引'''快速访问任意元素。几乎所有编程语言都原生支持数组。 == 核心特性 == 数组的三大核心特性使其成为高效的数据容器: # '''固定大小''':创建时需指定长度(部分语言支持动态数组) # '''连续内存''':元素在物理内存中相邻存储 # '''随机访问''':通过索引可在O(1)时间复杂度直接访问元素 数学表示为:<math>A = [a_0, a_1, ..., a_{n-1}]</math>,其中n为数组长度 <mermaid> graph LR A[内存地址1000] -->|a0| B[内存地址1004] B -->|a1| C[内存地址1008] C -->|...| D[内存地址1000+4*(n-1)] </mermaid> == 基本操作 == === 声明与初始化 === 不同语言的数组声明方式: <syntaxhighlight lang="python"> # Python列表(实际为动态数组) arr = [10, 20, 30, 40] </syntaxhighlight> <syntaxhighlight lang="java"> // Java静态数组 int[] arr = new int[]{1, 2, 3}; </syntaxhighlight> === 访问元素 === 通过索引访问(时间复杂度O(1)): <syntaxhighlight lang="javascript"> // JavaScript示例 let colors = ['red', 'green', 'blue']; console.log(colors[1]); // 输出"green" </syntaxhighlight> === 修改元素 === 直接通过索引赋值: <syntaxhighlight lang="c"> // C语言示例 int nums[3] = {5, 10, 15}; nums[0] = 8; // 数组变为[8, 10, 15] </syntaxhighlight> === 遍历数组 === 常见遍历方式对比: {| class="wikitable" ! 方式 !! 示例 !! 适用场景 |- | for循环 || <syntaxhighlight lang="cpp"> for(int i=0; i<length; i++) { cout << arr[i]; }</syntaxhighlight> || 需要索引时 |- | foreach || <syntaxhighlight lang="python"> for item in arr: print(item)</syntaxhighlight> || 仅需元素值 |} == 内存原理 == 数组的物理存储采用连续内存块,假设: * 每个元素占4字节 * 数组起始地址为1000 * 访问arr[2]的计算过程: <math> \text{地址} = \text{基地址} + \text{索引} \times \text{元素大小} \\ = 1000 + 2 \times 4 = 1008 </math> <mermaid> graph TD Start[基地址1000] --> Element0[arr[0]:1000-1003] Element0 --> Element1[arr[1]:1004-1007] Element1 --> Element2[arr[2]:1008-1011] </mermaid> == 多维数组 == 二维数组可视为"数组的数组",如矩阵: <syntaxhighlight lang="java"> // Java二维数组 int[][] matrix = { {1, 2, 3}, {4, 5, 6} }; System.out.println(matrix[1][2]); // 输出6 </syntaxhighlight> 内存布局(行优先存储): <mermaid> graph LR Row0 --> Col0[1] & Col1[2] & Col2[3] Row1 --> Col3[4] & Col4[5] & Col5[6] </mermaid> == 实际应用案例 == '''案例1:图像处理''' 灰度图像的像素矩阵用二维数组存储: <syntaxhighlight lang="python"> # 800x600分辨率的图像 pixels = [[0]*800 for _ in range(600)] pixels[50][100] = 255 # 设置(x100,y50)处像素为白色 </syntaxhighlight> '''案例2:游戏开发''' 背包物品栏使用数组管理: <syntaxhighlight lang="csharp"> // Unity C#示例 Item[] inventory = new Item[10]; inventory[0] = new Sword(); // 第一格放置剑 inventory[1] = new Potion(); // 第二格放置药水 </syntaxhighlight> == 复杂度分析 == {| class="wikitable" ! 操作 !! 时间复杂度 !! 说明 |- | 访问 || O(1) || 直接通过索引计算地址 |- | 搜索 || O(n) || 无序数组需线性查找 |- | 插入 || O(n) || 需移动后续元素 |- | 删除 || O(n) || 需移动后续元素 |} == 常见问题 == {{Warning|数组越界访问是初学者最易犯的错误}} <syntaxhighlight lang="cpp"> int arr[3] = {1,2,3}; cout << arr[3]; // 未定义行为!合法索引是0-2 </syntaxhighlight> == 进阶思考 == * 动态数组(如C++的vector)如何实现自动扩容? * 为什么数组索引通常从0开始而不是1? * 稀疏数组如何优化存储空间? {{SeeAlso|[[数据结构与算法学习路径结构/线性数据结构/链表]](数组的互补结构)}} [[Category:数据结构与算法]] [[Category:编程基础]] [[Category:计算机科学]] [[Category:线性数据结构]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)