数组
数组
标签(空格分隔): 数据结构和算法
理解数组
数组(Array)是一种**线性表数据结构**。它用**一组连续的内存空**间,来存储**一组具有相同类型的数据**
数组是如何实现根据下标随机访问数组元素
正是因为数组的特性:连续的内存空间和相同类型的数据
我们知道,计算机会给每个内存单元分配一个地址,计算机通过地址来访问内存中的数据。当计算机需要随机访问数组中的某个元素时,它会首先通过下面的寻址公式,计算出该元素存储的内存地址
base_address 初始是 1000
data_type_size int类型 4字节
a[i]_address = base_address + i * data_type_size
数组的删除和插入
正是因为数组的特性:**连续的内存空间和相同类型的数据**
数组的删除和插入 需要保持连续的内存空间,需要**移动元素**
如果在数组的末尾插入元素,那就不需要移动数据了,这时的时间复杂度为 O(1)。但如果在数组的开头插入元素,那所有的数据都需要依次往后移动一位,所以最坏时间复杂度是 O(n)
实际上,在某些特殊场景下,我们并不一定非得追求数组中数据的连续性。如果我们将多次删除操作集中在一起执行,删除的效率是不是会提高很多呢?我们继续来看例子。数组 a[10]中存储了 8 个元素:a,b,c,d,e,f,g,h。现在,我们要依次删除 a,b,c 三个元素
为了避免 d,e,f,g,h这几个数据会被搬移三次,我们可以先记录下已经删除的数据。每次的删除操作并不是真正地搬移数据,**只是记录数据已经被删除**。**当数组没有更多空间存储数据时**,我们再触发执行一次真正的删除操作,这样就大大减少了删除操作导致的数据搬移
为什么数组的下标要从0开始
计算内存地址:如果从0开始
a[k]_address = base_address + k * type_size
计算内存地址:如果从1开始
a[k]_address = base_address + (k-1)*type_size
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理