我一直在学习 Java SE 7 的技巧。我已经阅读了有关以下内容的声明ArrayList
:
- 访问是在恒定时间内执行的。
- 插入/删除以线性时间执行。
我想知道什么是恒定和线性时间访问?
恒定时间意味着每个操作执行所需的时间有一个硬性限制。
线性时间意味着ArrayList
is 越长(它包含的对象越多)操作所需的时间就越长。连接是线性的,即time(op) <= CONST * #elements
在复杂度分析中,我们将其称为大 O 表示法,线性时间为O(n)
,常数时间为O(1)
其原因是:
含义是:
常数意味着时间总是相同的,与列表的长度无关。
[常数时间在Big-O 表示法中也称为O(1) ]
线性意味着 List 增长得越多,时间就越长,但是以线性方式,例如,要对包含 20 个元素的列表执行线性操作,它将花费 10 个元素的列表所需时间的两倍.
[线性时间在Big-O 表示法中也称为O(n) ]
A precisation:在比较算法时通常提供最坏情况下的性能,因此这意味着所需的时间小于或等于线性。
在您的情况下, List 的实现基于数组(因此名称ArrayList),如下所示:
访问时间是恒定的,因为当程序知道列表的第一个元素在哪里以及每个单元格有多大时,它可以使用简单的数学直接获取第n个元素,例如:
element_n_cell = element_1_cell + (cell_size * n)
插入和删除更耗时,原因有两个:
当你在一个位置插入或删除一个元素时,后面的所有元素都需要移动。
数组无法调整大小,因此当您实例化一个新的 ArrayList 时,Java 将创建一个具有预定义长度s的数组,并且只要适合,它将使用相同的数组。当您添加第(s+1)个元素时,程序需要创建一个更大的数组并复制新数组中的所有元素。
不明白恒定时间访问
java.util.ArrayList实现了java.util.RandomAccess接口,这是一个标记接口,表示您可以直接访问此集合的任何元素。这也意味着访问任何元素都需要相同的时间(恒定时间)。
如果我们使用 java.util.LinkedList,访问最后一个元素要比访问第一个元素花费更多的时间。