数据结构和算法:数组

1.什么数组

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

关键词1:线性表:数组、链表、栈、队列等都是线性表结构;每一个线性表上的数据最多只有前和后两个方向。编程

关键词2:连续的内存空间和相同类型的数据数组

因为数组具备上述两个限制,因此数组才具备杀手锏般的特性:“随机访问”。网络

数组数据的随机访问:数据结构

寻址公式:a[i]_address = base_address +i * data_type_size框架

数组与链表的区别:数组适合查找支持随机访问依据下标随机访问的时间复杂度为O(1);链表适合插入和删除,时间复杂度为O(1)。数据结构和算法

2.容器是否能够替代数组?

ArrayList最大的优点是能够将数组才作的细节封装起来,好比数组插入、删除数据时须要搬移其余数据等,另一个优点就是支持动态扩容编程语言

对于业务开发,直接使用容器就够了,可是作一些很是底层的开发,好比开发网络框架,须要将性能的优化作到极致,这时候数组就会优于容器成为首选。post


3.为何大多数编程语言中,数组要从0开始编号,而不是1?

从数组的内存模型来看,“下标”最确切的定义应该是“偏移(offset)”。若用a表示数组的首地址a[0]就是偏移为0的位置a[k]就是偏移k个type_size的位置,因此计算a[k]的地址的公式为:性能

a[k]_address = base_address + k * type_size

可是若是数组从1开始计数的话,寻址公式就会变成:

a[k]_address =base_address + ( k-1 ) * type_size

对比这两个公式能够发现,从1开始编号,每次随机访问数组元素都多了一次减法运算,对于CPU来说,就是多了一次减法指令


二维数组a[m][n]的内存寻址公式:

a[i][j]_address =base_address + ( i * n + j ) * type_size


下一篇:数据结构和算法:链表(上)

相关文章
相关标签/搜索