我正在研究Java中的数据结构和算法,我无法理解本书的这一部分。
以下是本书的内容:
另一方面,如果我们通过在前面添加项目来构建List,
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)操作?
答案 0 :(得分:0)
使用链接列表,只需在插入列表前面时更改指向新节点的头指针即可。使用数组列表,每次插入列表前面时都必须移动数组中的每个元素。
答案 1 :(得分:0)
答案在于名字。 LinkedList与ARRAYList。由于LinkedList是一个动态结构,每次你想要添加到尾部时都保持一个尾(也可以包含一个头指针)指针,设置一些新值并将尾指针设置为新添加的值是一件简单的事情。 。
正如Aaron Davis所提到的那样,有了数组列表,你必须改变所有的值。另外要记住的是,数组是一个有限大小的结构,因此每次达到最大值时都需要调整它,这需要花费时间。由于这些原因,LinkedLists在添加时更好。但是,因为数组列表在它的引擎下使用了一个数组,所以它在查找方面会更快,因为它是一个连续的内存块而不是一组不同的指针。因此,在数组列表中查找是O(1),而LinkedList是O(n)
这是一个非常有用的链接,描述了两者之间的区别:http://beginnersbook.com/2013/12/difference-between-arraylist-and-linkedlist-in-java/
答案 2 :(得分:0)
ArrayList的检索操作比LinkedList快,而LinkedList的insert,delete,update操作比ArrayList快。 有具体原因。 ArrayList是一种列表,其中当一个对象在其中一个被更改时,对象彼此相邻地存储,创建新的ArrayList并且复制所有元素,而容易遍历ArrayList。 现在,当我们谈论LinkedList时,它们不会以连续的方式存储在堆中,它们保存下一个和前一个对象的地址,因此当我们进行更改时,它只是更改下一个和上一个对象的引用地址。因此,与ArrayList相比,检索是耗时的,因为它通过地址跟踪以找到第n个索引元素。
答案 3 :(得分:0)
1) ArrayList get(int index)操作在常量时间O(1)运行,而LinkedList get(int index)操作运行时间为O(n)。
ArrayList比LinkedList更快的原因是ArrayList使用基于索引的系统作为其元素,因为它在内部使用数组数据结构,另一方面,LinkedList不为其元素提供基于索引的访问,因为它从开始或结束(以较近者为准)检索指定元素索引处的节点。
2) insert()或add(Object)操作:与ArrayList相比,LinkedList中的插入通常很快。
在LinkedList中添加或插入是O(1)操作。在ArrayList中,如果数组已满,即最坏的情况,则需要额外调整数组大小和将元素复制到新数组的成本,这使得在ArrayList O(n)中添加操作的运行时,否则它是O(1)。
3) remove(int)操作:LinkedList中的删除操作通常与ArrayList相同,即O(n)。 在LinkedList中,有两个重载的删除方法。一个是remove(),没有任何参数删除列表的头部并在恒定时间O(1)中运行。 LinkedList中另一个重载的remove方法是remove(int)或remove(Object),它删除作为参数传递的Object或int。此方法遍历LinkedList,直到找到Object并将其与原始列表取消链接。因此,此方法运行时间为O(n)。
在ArrayList中,remove(int)方法涉及将元素从旧数组复制到新更新的数组,因此其运行时间为O(n)。