【数据结构】数组

一、数组的定义及特点

定义:数组(Array)是一种线性表数据结构。他用一组连续的内存空间,来存储一组具有相同类型的数据

  • 线性表数据结构

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

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

  连续的内存空间指的是一条线上的每一个数据的存储空间都有前后两个与之相连的内存空间,数据类型必须相同。正因为有这两个属性才能让高效随机访问通过下标得以实现。

  假设随机访问一个数组a[i],计算机会给每个内存单元分配一个地址,计算机通过地址来找出数据。它会首先通过下面的寻址公式,计算出该元素存储的内存地址:

a[i]_address = base_address + i * data_type_size

其中data_type_size表示数组中每个元素的大小。
因为数组是连续存储的,所以根据首地址和下标,通过寻址公式就能直接计算出对应的内存地址,找出数据。

​  常常会问数组和链表的区别,很多人都回答说,“链表适合插入、删除,时间复杂度 O(1);数组适合查找,查找时间复杂度为 O(1)”。

  实际上,这种表述是不准确的。数组是适合查找操作,但是查找的时间复杂度并不为 O(1)。即便是排好序的数组,你用二分查找,时间复杂度也是 O(logn)。所以,正确的表述应该是,数组支持随机访问,根据下标随机访问的时间复杂度为 O(1)。

二、数组的操作

数组的插入

  • 数组头部插入

  在数组的头部插入一个元素的时候,所有的元素都需要向后挪一位,时间复杂度为O(n)

  • 数组中间插入

  在数组中间插入元素时,加入插入的位置为k,则k之后的所有数据都需要往后移一位,时间复杂度为O(n)。

  如果说,数组只是被用来当作一个存储集合,而不用考虑数组中数据的顺序,为了避免大规模的数据迁移,可以直接将第k个位置的数据迁移到数组的最后,然后将新元素直接放到第k个位置,时间复杂度为O(1)

  • 数组尾部插入

  在数组尾部插入时,不需要进行数据的迁移,时间复杂度为O(1)

数组的删除

  • 数组头部删除

  该种情况下,数组需要保持内存空间的连续性,所以也需要搬移数据,时间复杂度为O(n)

  • 数组中间删除

  该种情况下,数组为了保持内存的连续性,也需要搬移数据,不然中间会出现空洞,内存就不连续了,时间复杂度也为O(n)

  • 数组尾部删除

  该种情况下,数组其他的数据不需要进行移动,时间复杂度为O(1)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值