数据结构与算法篇 数组

1 什么是数组?

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

内存地址计算公式:a[i]_address = base_address + i * data_type_size (data type size就是数据类型,假如是int类型就4字节)。

 

2 什么是线性表与非线性表?

线性表:数据排成一条线一样的结构,最多只有前和后两个方向,例如数组,链表,队列,栈等等。

非线性表:数据不是简单的前后关系,例如二叉树,堆,图等等

 

3 数组的特点与优点?

从概念我们可以看出来是的连续的内存空间和相同类型的数据这两个特点,数组支持随机访问,根据下标随机访问的时间复杂度为O(1),需要注意的是,即使数组是排好序的,进行二分查找也需要O(log n)的时间复杂度。

它的缺点是低效的插入和删除,简单的来说,最好的时间复杂度是O(1),最坏的时间复杂度是O(n),平均时间复杂度是O(n),也有些特殊情况是不一样的。

 

4 关于插入和删除有那些特殊的操作?

插入:如果数组中的数据是有序的,我们在某个位置插入一个新的元素的时候,必须搬移n位数据;但是如果存储数据没有任何规律,数组只是单纯的一个存储集合,直接将第k位的数据移到数组元素的最后,新的元素放在第k位。

 

删除:如果在删除数据的时候我们不追求数组数据的连续性,我们可以将多次删除操作一起执行,等到数组没空间的时候再去执行删除操作。JVM标记清楚垃圾回收算法的核心思想。
 
5 为什么数组是从0开始计数?
从数组存储的模型来看,“下标”的最切确的定义是偏移“offset”,a[0]就是0偏移,a[k]就是偏移为k
内存地址计算公式:a[i]_address = base_address + i * data_type_size (data type size就是数据类型,假如是int类型就4字节)。
当然你想要搞成从1计数也是可以的,除非你改成a[i]_address = base_address + (i-1) * data_type_size,
但是同时你也会发现一个问题,每次访问数组的时候,cpu都需要做多一次额外的减法指令,数组作为非常基础的数据结构,当然越简洁越好。

 

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