数据结构学习笔记 - 数组

数组

基础数据结构

定义

数组是一种线性表数据结构, 使用一组连续内存空间, 存贮一组具有相同类型的数据.
提炼两组关键词:
1. 线性表
线性表只有前后两个方向, 同样线性表还有链表, 队列, 栈.
非线性表有二叉树, 堆, 图等, 数据并不是前后关系.
2. 连续内存空间和相同类型的数据
因为这两个限制, 数组拥有了随机访问的特性, 但也有利有弊, 插入和删除操作变得低效.

数组插入操作平均时间复杂度O(n), 当数据无序时, 可将插入位置元素直接搬到末尾来优化执行速度.
数组删除操作平均时间复杂度O(n), 当不追求数据连续性时, 可先记录已删除数据, 当数据没有空间时, 再出发真正的删除, 类似jvm的标记清除垃圾回收算法.

链表和数组的区别

链表插入删除时间复杂度O(1), 数组根据下标随机访问时间复杂度O(1).

选容器还是数组

关于编程语言中包装好的容器, 比如java中的ArrayList, 该如何选择
数组可存储基础数据类型, 且性能更好, 但容器更方便易用, 所以
业务开发中可使用容器, 省时省力; 底层开发时, 如需要性能优化到极致, 可使用数组.

为什么数组下标从0开始

下标也是在内存上的偏移量, 寻址的时候可以直接首地址+偏移量*type_size, 如果下标从1开始, 则需要多做一次减法运算, 对于数组这种最基础的数据结构, 为了性能, 选择从0开始编号. (也可能不是, 无从求证)

特别应用

差分数组

给定一个数组a

下标01234567
a(i)12549790

要求从下标1到下标6, 每个数加1, 最傻瓜的办法就是遍历, 但如果数组有上千万个数, 且经常需要类似的区间修改, 遍历就有点费时费力了

所以就需要用到差分数组, 通过预处理原数组a, 得到一个新数组d, 大小和原数组相等, 每一个元素
d ( i ) = a ( i ) − a ( i − 1 ) , ( i ! = 0 ) d(i)=a(i)-a(i-1),(i!=0) d(i)=a(i)a(i1),(i!=0)
d ( 0 ) = a ( 0 ) d(0)=a(0) d(0)=a(0)
即每个位置上记录的是当前位置和前一位数据的差值

下标01234567
a(i)12549790
d(i)113-15-23-9

构造好以后, 再看从下标1到下标6加一, 不需要遍历, 只需要给d(1)+1, 再给d(7)-1, 中间的所有元素都自动加了1
优点是: 适用于区间范围较大, 区间频繁修改
缺点是: 查询数组a某个位置数据时, 需要根据差分数组从前向后求和

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值