繁体   English   中英

为什么LinkedList和ArrayList的运行时间不同

[英]why the running time of the LinkedList and the ArrayList are not the same

我正在研究Java中的数据结构和算法,因此我无法理解本书的这一部分。

这是书上写的:

另一方面,如果我们通过在前面添加项目来构建列表,

 public static void makeList2( List<Integer> lst, int N )
     {
         lst.clear( );
         for( int i = 0; i < N; i++ )
             lst.add( 0, i );
}

对于LinkedList,运行时间为O(N),而对于ArrayList,运行时间为O(N 2 ),因为在ArrayList中,在前面进行加法是O(N)操作。

我的问题是我不明白为什么运行时间不同? 又为什么在ArrayList中,在前面添加一个O(N)操作?

使用链接列表,只需在列表的前面插入时就将指向新节点的头指针更改。 使用数组列表时,每次插入列表的前面时,都必须移动数组中的每个元素。

答案在于名字。 LinkedList与ARRAYList。 由于LinkedList是动态结构,每次您想添加到尾部时都会维护一个尾部(也可以包含一个头部指针)指针,因此只需设置一些新值并将尾部指针设置为新添加的值即可。

正如亚伦·戴维斯(Aaron Davis)所提到的,使用数组列表,您必须移动所有值。 要记住的另一件事是,数组是有限大小的结构,因此,每次达到最大值时,都需要调整其大小,这需要时间。 由于这些原因,LinkedLists与添加项相比更好。 但是,由于数组列表在其内部使用数组,因此在查找方面会更快,因为它是连续的内存块,而不是不同指针的集合。 因此,在数组列表中查找的是O(1),而LinkedList是O(n)

这是一个非常有用的链接,描述了两者之间的区别: http : //beginnersbook.com/2013/12/difference-between-arraylist-and-linkedlist-in-java/

ArrayList的检索操作比LinkedList快,而LinkedList的插入,删除,更新操作比ArrayList快。 有特定的原因。 ArrayList是一种列表,当对象中的一个改变时,对象在内存中彼此相邻存储,创建新的ArrayList并复制所有元素,而轻松遍历ArrayList则很容易。 现在,当我们谈论LinkedList时,它们并没有以连续的方式存储在堆中,而是保留了下一个和上一个对象的地址,因此当我们进行更改时,它们只是更改了下一个和上一个对象的引用地址。 因此,与ArrayList相比,检索很耗时,因为它通过地址跟踪以找到第n个索引元素。

1) ArrayList get(int index)操作以恒定时间O(1)运行,而LinkedList get(int index)操作运行时间为O(n)。

ArrayList比LinkedList快的原因是ArrayList对其元素使用基于索引的系统,因为它内部使用数组数据结构,另一方面,LinkedList从其开始或结束进行迭代时不为其元素提供基于索引的访问(以较近者为准)以指定元素索引检索节点。

2) insert()或add(Object)操作:LinkedList中的插入通常比ArrayList快。

在LinkedList中,添加或插入是O(1)操作。 在ArrayList中,如果数组已满(即最坏的情况),则需要调整数组大小并将元素复制到新数组中,这会产生额外的开销,这会使ArrayList中的add操作运行时为O(n),否则为O(1)。

3) remove(int)操作:LinkedList中的remove操作通常与ArrayList相同,即O(n)。 在LinkedList中,有两个重载的remove方法。 一个是remove(),不带任何参数,该参数删除列表的开头并以固定时间O(1)运行。 LinkedList中另一个重载的remove方法是remove(int)或remove(Object),它们删除作为参数传递的Object或int。 此方法遍历LinkedList,直到找到Object并将其与原始列表取消链接。 因此,该方法的运行时间为O(n)。

在ArrayList中,remove(int)方法涉及将元素从旧数组复制到新的更新数组,因此其运行时间为O(n)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM