Arrays 何时在数组/数组列表上使用链表?
我使用了很多列表和数组,但是我还没有遇到一种场景,在这种场景中,数组列表不能像链表一样容易地使用,如果不是比链表更容易的话。我希望有人能给我一些例子,当链表特别好的时候。 如果你需要在中间插入项目,不想开始调整数组大小和改变事物的话,列表的优势就出现了。p> 你是对的,通常情况并非如此。我有过一些非常具体的案例,但不是太多 阵列有O(1)个随机访问,但在其中添加内容或从中删除内容的成本非常高Arrays 何时在数组/数组列表上使用链表?,arrays,list,arraylist,linked-list,Arrays,List,Arraylist,Linked List,我使用了很多列表和数组,但是我还没有遇到一种场景,在这种场景中,数组列表不能像链表一样容易地使用,如果不是比链表更容易的话。我希望有人能给我一些例子,当链表特别好的时候。 如果你需要在中间插入项目,不想开始调整数组大小和改变事物的话,列表的优势就出现了。p> 你是对的,通常情况并非如此。我有过一些非常具体的案例,但不是太多 阵列有O(1)个随机访问,但在其中添加内容或从中删除内容的成本非常高 链表在任何地方添加或删除项目以及进行迭代都非常便宜,但随机访问是O(n)。当: 您需要从列表中进行恒定时
链表在任何地方添加或删除项目以及进行迭代都非常便宜,但随机访问是O(n)。当:
数组列表(如.Net中的列表)为您提供了数组的好处,但可以为您动态分配资源,这样您就不必太担心列表的大小,并且可以在任何索引中删除项目,而无需任何努力或重新排列元素。就性能而言,Arraylist比原始数组慢。嗯,Arraylist可以用于以下情况:
例如,您需要导入和访问联系人列表中的所有元素(其大小您不知道)要添加到其他答案,大多数数组列表实现在列表末尾保留额外的容量,以便可以在O(1)时间内将新元素添加到列表末尾。当超过数组列表的容量时,将在内部分配一个新的、更大的数组,并复制所有旧元素。通常,新数组的大小是旧数组的两倍。这意味着,在这些实现中,向数组列表的末尾添加新元素通常是一个O(1)操作。因此,即使您事先不知道元素的数量,数组列表也可能比链表更快地添加元素,只要您在末尾添加元素。显然,在数组列表的任意位置插入新元素仍然是一个O(n)操作 访问数组列表中的元素也比访问链表快,即使访问是顺序的。这是因为数组元素存储在连续内存中,可以轻松缓存。链表节点可能分散在许多不同的页面上
如果您知道要在任意位置插入或删除项目,我建议您只使用链接列表。数组列表对于几乎所有其他内容都会更快。使用链表对数组进行基数排序和多项式运算。这些是最常用的集合实现 阵列列表:
- 在末尾插入/删除O(1)最坏情况O(n) <> >插入/删除在中间O(n)
- 检索任意位置O(1)
- 在任何位置O(1)插入/删除(如果您有对元素的引用,请注意)
- 检索第一个或最后一个元素O(1)
2) Arraylist(O(1))中的搜索(get method)操作速度很快,但LinkedList(O(n))中的搜索(get method)操作速度不快,因此,如果添加和删除操作较少,而搜索操作要求较多,Arraylist将是您的最佳选择。我认为主要区别在于您是否经常需要插入或删除列表顶部的内容 对于一个数组,如果从列表的顶部删除某个元素,那么复杂性为o(n),因为数组元素的所有索引都必须移位 对于链表,它是o(1),因为您只需要创建节点、重新分配头并将引用分配给下一个作为上一个头 当频繁插入o
Algorithm ArrayList LinkedList
seek front O(1) O(1)
seek back O(1) O(1)
seek to index O(1) O(N)
insert at front O(N) O(1)
insert at back O(1) O(1)
insert after an item O(N) O(1)