数据结构与算法之数组

279 阅读2分钟

数组

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

线性表是数据排成像一条线一样的结构,数据之间只有前与后的关系,数组、链表、队列、栈等都是线性表结构。

与之对立的是非线性表结构,比如二叉树、堆、图等,之所以叫非线性,因为在非线性表中,数据之间并不是简单的前后关系。

正式因为是一种线性表结构,加上连续的内存空间存储相同的数据结构才有随机访问的特点。但与此同时,删除、插入等操作也相对低效。


为什么数组都是从 0 开始编号?

计算机会给每个内存单元分配一个地址,计算机通过地址来访问内存中的数据。当计算机需要随机访问数组中的某个元素时,它会通过寻址公式,计算出该元素存储的内存地址。

如果用 a 表示首地址,则a[0] 表示偏移量为 0 的位置,也就是首地址,a[k] 就表示偏移量为k个type_size 的位置,所以a[k] 的内存地址只需要使用这个公式:

a[k]_address = base_address + k * type_size

如果数组从 1 开始计数,则我们计算数组元素a[k] 的内存地址就会变为:

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

如果使用第二个公式,每次访问数组元素都会多一次减法运算


JVM 标记清除垃圾回收算法的核心思想

为了避免数据会被搬移多次,我们可以先记录下已经删除的数据。每次的删除操作并不是真正地搬移数据,只是记录数据已经被删除。当数组没有更多空间存储数据时,我们再触发执行一次真正的删除操作,这样就大大减少了删除操作导致的数据搬移。

该算法有效降低了数组删除元素的复杂度。

总结

优点

支持随机访问

缺点

插入、删除低效,平均情况时间复杂度为O(n)