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];
计算机为我分配空间
寻址公式
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+i∗data_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+(i∗cols_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
- 超级注重性能的,比如图像开发,网络服务器等,或业务逻辑超级简单的,数据类型固定,操作简单固定,用原生数组。其他一般的业务逻辑用高级封装容器实现。
- 即使用高级容器封装,也应该尽量给出更多的底层信息。比如如果事先知道数据规模的,就要给定容器的容量。