ArrayList恒定时间和线性时间访问

时间:2012-11-08 12:10:51

标签: java data-structures

我一直在学习Java SE 7的技巧。我已阅读有关ArrayList的声明:

  • 访问恒定时间中执行。
  • 插入 / 删除线性时间执行。

我想知道什么是常量线性时间访问?

3 个答案:

答案 0 :(得分:11)

恒定时间意味着每个操作执行所需的时间很难。

线性时间表示ArrayList越长(包含的对象越多),操作时间越长。连接是线性的,即time(op) <= CONST * #elements

在复杂性分析中,我们将其称为big O notation,线性时间为O(n),常量时间为O(1)


原因是:

  • 访问是普通的阵列访问,它在RAM机器(例如外出PC)中持续进行。
  • 插入/删除 - 如果它不在最后一个元素中,则需要移动所有后续元素:(插入请求向右移动,删除到左侧) - 因此您实际上需要线性数量的OP来执行插入/删除(除非它是最后一个元素)

答案 1 :(得分:9)

含义是:

  • 常量表示时间总是相同的,与List的长度无关。

    [常量时间Big-O notation中也称为 O(1)

  • 线性意味着List越长,时间越长,但是以线性方式,例如对包含20个元素的列表执行线性操作将需要两倍于包含10个元素的列表所需的时间。

    [线性时间Big-O notation中也称为 O(n)

    预精化:当比较算法通常提供最差情况性能时,这意味着所需时间小于或等于线性。

在你的情况下,List的实现是基于数组(所以名称​​ ArrayList ),如下所示:

Java ArrayList explaination

访问时间是不变的,因为当程序知道列表的第一个元素在哪里以及每个单元格有多大时,它可以使用简单的数学直接获取 n -th元素,如: / p>

element_n_cell = element_1_cell + (cell_size * n)

插入和删除更加耗时,原因有两个:

  1. 当您在某个位置插入或删除元素时,需要移动以下所有元素。

  2. 无法调整数组的大小,因此当您实例化一个新的ArrayList时,Java将创建一个具有预定义长度 s 的数组,并且它将使用相同的数组作为只要它适合。当您添加(s + 1) -th元素时,程序需要创建一个更大的数组并复制新数组中的所有元素。

答案 2 :(得分:0)

理解恒定时间访问

java.util.ArrayList 实现了 java.util.RandomAccess 接口,这是一个标记接口,表示您可以直接访问此集合的任何元素。这也意味着访问任何元素都需要相同的时间(恒定时间)。

如果我们使用 java.util.LinkedList,访问最后一个元素比访问第一个元素需要更多的时间。