算法学习笔记:数组

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

两个特性

线性表与非线性表

顾名思义线性表就是数据排成一条线一样的数据结构。最多只有前后两个方向。
线性表数据:数组,链表,队列,栈

算法学习笔记:数组_第1张图片
线性表,摘自极客时间

二叉树,堆,图,不是简单的前后关系。


算法学习笔记:数组_第2张图片
非线性表结构

连续的内存空间与相同类型的数据结构

杀手级特性,随机访问。
有利有弊:随机访问高效,但是删除和插入数据,为了保证数据的连续性,就得做大量的数据迁移工作。

随机访问数据

数据怎么做到随机访问数据的。
首先内存是连续的,每个内存单元都会有地址,计算机通过地址来访问内存中的数据。
计算寻址的话就需要用到寻址公式。

//其中 dataTypeSize 是存入的数据类型的字节大小,比如int是四字节,那么dataTypeSize就是四字节
a[i]_address = baseeAddress +i * dataTypeSize

数据随机访问查找的时间复杂度是O(1);
排序好的数组,用二分法查找,时间复杂度也是O(logn)

低效的插入与删除

插入:

  • 现在有一组数据包含了a,b,c,d,e,f 数据 我们在c与d之间插入h 那么为了保证数据的完整性,必须把后面的数据做迁移操作。时间复杂度最坏的情况就是O(n);
    删除:
  • 同样是前面的a,b,c,d,e,f数据把c,d,e删除,那么同插入一样,需要做搬移的操作,时间复杂度上是O(n)
    这两个操作都是为了保证内存的连续性。不然会出现空洞,内存不连续。

有一种提高删除的效率的方法:数据首先不做真正的删除,只做标记删除,等内存不足等情况的时候再去真正的删除,提高删除的效率。

数据越界问题

在java中数组下标超出所存储的内容大小的时候,会爆出内存溢出的问题。

容器是否会代替数组

  • 容器不存储基本类型数据,并且有性能损耗,如果程序考虑性能,数组比较适合。
  • 数据大小事先知道,不需要使用ArrayList提供的方法,可以直接使用数组。
  • 多维数组比多维容器方面直接。

数组为什么从0开始。而不是从1开始

0表示的数据数据的偏移量位置,这样在利用公式的时候直接使用即可。
从1开始或者从其他数字开始,都需要cpu进行一次减法操作。
主要原因,历史原因,兼容C语言的成本。

你可能感兴趣的:(算法学习笔记:数组)