数组
-
一种线性表数据结构,用一组连续的内存空间,存储一组具有相同类型的数据。
线性:数据排成相一条线一样的结构,每个线性表上的数据最多只有前后两个方向。
-
连续的内存空间和相同类型的数据。
由于连续的内存空间,数组支持随机访问;但插入和删除为了保证连续,就需要进行大量数据搬移。
随机访问公式:a[i] = base_address + i * data_type_size。
-
插入:
在末尾插入:O(1),在开头插入,因为涉及到元素移动O(n),平均O(n)。
-
有序:平均O(n)。
-
无序:
技巧:我们可以将要插入的位置的元素替换为当前元素,再将要插入位置的元素插入到线性表末尾。(如果不涉及数组的扩容,时间复杂度为O(1),否则为O(n))。
例如:[a, b, c, d, e].
在位置2插入n,则为[a, b, n, d, e, c].
-
-
删除
如果我们要删除第k个位置的数据,为了内存的连续性,也需要搬移数据。
和插入类似,删除末尾O(1),删除开头为O(n),平均O(n)。
技巧:我们可以将删除后的数据打标记为已删除,这样,等到一段时间后,再批量删除线性表中的数据,这样,元素的移动次数可能会变少,效率就会提升。
例如:[a, b, c, d, e, f]
一段时间内,相继删除了a, b, c。此时进行真正删除操作[d, e, f].
def这三个元素就会只进行一次移动,而不是三次。
-
容器
ArrayList
,如果能实现确定数组大小,最好事先指定数据大小。ArrayList
无法存储基本类型。