【Algo】数组 Array

Backto Algo Index

定义

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

  • 线性表(Linear List) :内存是连续地址一条生产线,线性表就是上面一个坑一个坑的放数据,所有的元素最多有两个方向。常见的线性表结构有 array,list,stack,queue 等。常用的非线性表,有 tree 和 graph 等
  • 连续内存空间存储。这个是 array 最重要的特点,也就是说n个元素的array中的数据是依次在 0号坑,1号坑,。。。,n-1 号坑存储的。这决定了array 的最重要特性:依下标随机访问。当然随之而来的还有限制,为保证连续性,insert 和 delete 就要做大量的数据搬移工作。
  • 相同的数据类型。保证统一性。

数据的存储与访问

我一个指令,

int a[] = new int[10];

计算机为我分配空间

【Algo】数组 Array_第1张图片

寻址公式

a [ i ] a d d r e s s = b a s e a d d r e s s + i ∗ d a t a _ t y p e _ s i z e a[i]_{address} = base_{address} + i * data\_type\_size a[i]address=baseaddress+idata_type_size

b a s e a d d r e s s base_{address} baseaddress也就是 a [ 0 ] a d d r e s s a[0]_{address} a[0]address, 也就是图中的地址 1000.

对于二维数组,比如图像,行存储形式, 按下标访问第 i i i j j j列就是

a [ i ] [ j ] a d d r e s s = b a s e a d d r e s s + ( i ∗ c o l s _ n u m + j ) ∗ d a t a _ t y p e _ s i z e a[i][j]_{address} = base_{address} + (i*cols\_num + j) * data\_type\_size a[i][j]address=baseaddress+(icols_num+j)data_type_size

常用操作的时间复杂度分析

  • Access : 支持依下标的随机访问,复杂度 O ( 1 ) O(1) O(1),完美
  • Search: best - O ( 1 ) O(1) O(1), worst - O ( n ) O(n) O(n), average - O ( n ) O(n) O(n)
  • Insertion : best - O ( 1 ) O(1) O(1), worst - O ( n ) O(n) O(n), average - O ( n ) O(n) O(n)
  • Deletion : best - O ( 1 ) O(1) O(1), worst - O ( n ) O(n) O(n), average - O ( n ) O(n) O(n)

优化思路

语言实现和特点

  • C :原生数组
  • C++ : 原生数组 + STL封装 vector
  • Java : 原生数组 + 高级封装 ArrayList
  • Python : 没有数组,有 List,Tuple, Dictionary 等,支持负数下标
  • Matlab :特立独行 ,数组下标从 1 开始, 多维数组列存储

最佳实践 Best Practice

  • 超级注重性能的,比如图像开发,网络服务器等,或业务逻辑超级简单的,数据类型固定,操作简单固定,用原生数组。其他一般的业务逻辑用高级封装容器实现。
  • 即使用高级容器封装,也应该尽量给出更多的底层信息。比如如果事先知道数据规模的,就要给定容器的容量。

Ref

  • 数据结构与算法之美–By 王争

你可能感兴趣的:(Algo)