数组

数组

本文只是我的个人学习笔记,用于记录数据结构和算法的学习总结。

什么是数组

数组是用来存储一组具有相同类型数据的一组连续内存空间。是一种线性数据结构。

什么是线性表

线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表。

特性

连续的内存空间和相同类型的数据。

优点:具有随机访问的特性
缺点:删除,插入数据效率低

数组怎么实现下标随机访问

以一维数组举例:

a[i]_address = base_address + i * data_type_size

其中base_address是内存块的首地址,也就是a[0]。data_type_size是数组中每个元素的大小。

二维数组计算方式:
Array[m][n], a[i][j]_address=base_address + (i*n+j)*data_type_size

数组根据下标随机访问的的时间复杂度是 O(1)

低效的插入和删除

最好时间复杂度: O(1)。
最坏时间复杂度:O(n)。
平均时间复杂度:(1+2+…n)/n=O(n)。

提高效率:将多次删除操作中集中在一起执行,可以先记录已经删除的数据,但是不进行数据迁移,而仅仅是记录,当发现没有更多空间存储时,再执行真正的删除操作。

为什么大多数编程语言中,数组要从 0 开始编号,而不是从 1 开始?

从数组存储的内存模型上来看,“下标”最确切的定义应该是”偏移“
a[0] 就是偏移为 0 的位置,也就是首地址,a[k] 就表示偏移 k 个 type_size 的位置。所以计算 a[k] 的内存地址只需要用这个公式(以C语言为例):

a[k]_address = base_address + k * type_size

如果数组从 1 开始计数,那我们计算数组元素 a[k] 的内存地址就会变为:

a[k]_address = base_address + (k-1)*type_size

从 1 开始编号,每次随机访问数组元素都多了一次减法运算,对于 CPU 来说,就是多了一次减法指令。

我觉得最主要的是因为C语言是从0开始的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值