数据结构与算法 / 数组(Array)

@time    2019-07-18
@author  Ruo_Xiao
@notice  64位OS

一、基础知识

1、数组的定义

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

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

这种数据的组织方式,直接导致了数据具有核心特性:随机访问

实现公式(寻址公式)如下:

a[i]_address = a_address + i * type_size

通过上述公式,也能够明白为什么数组的下标为什么从0开始。若从1开始的话,那么上述公式就变成了 

a[i]_address = a_address + (i - 1) * type_size

像数组这种编程语言最底层的数据结构,性能必须优化到极致,所以采用了下标从0开始的模式。 

拓展:二维数组的寻址公式为

// 假设二位数组为 m * n
a[i][k]_address = a_address + (i * n + k) * type_size

二、相关操作

为了保持内存空间的连续性,数组的插入和删除是低效的,因为操作之后要进行数据迁移。

1、插入

  • 插入的位置在队尾,时间复杂度为 O(1) 。
  • 插入的位置在队首,时间复杂度为 O(n)。
  • 平均复杂度,因为插入的位置是随机的,即:概率相同。所以,平均复杂度为
 (1 + 2 + 3 + …… + n) / n = ( n + 1 ) * n / ( 2 * n ) = (1/2)n + (1/2) = O(n)
  • 如果对数组的顺序没有要求,那么可以将插入的位置的原数据放入数组末尾,将新数据赋值到该位置,时间复杂度为O(1) 。为 O(1) 的原因是该操作不会随着数组元素数量的变大而变大,执行的指令数量相同,所以复杂度为 O(1) 。

2、删除

  • 删除的位置在队尾,时间复杂度为 O(1) 。
  • 删除的位置在队首,时间复杂度为 O(n)。
  • 平均复杂度为 O(n) 。计算过程参考 “插入” 部分。
  • 很多时候,为了追求软件性能,可以将数组中待删除的数据标记为已删除状态,然后定时对已经删除的数据进行集中删除操作,这种思想类似于 JVM 的垃圾回收机制。

        其实上述操作,在 C++ 中 vector 早已封装好,所以在 C++ 编程中,推荐使用vector代替数组。当然了,那些对于性能有卓越的追求的领域,数组还是无可替代的。

 

 

(SAW:Game Over!)

你可能感兴趣的:(数据结构与算法)