Arrays 何时在数组/数组列表上使用链表?

Arrays 何时在数组/数组列表上使用链表?,arrays,list,arraylist,linked-list,Arrays,List,Arraylist,Linked List,我使用了很多列表和数组,但是我还没有遇到一种场景,在这种场景中,数组列表不能像链表一样容易地使用,如果不是比链表更容易的话。我希望有人能给我一些例子,当链表特别好的时候。 如果你需要在中间插入项目,不想开始调整数组大小和改变事物的话,列表的优势就出现了。p> 你是对的,通常情况并非如此。我有过一些非常具体的案例,但不是太多 阵列有O(1)个随机访问,但在其中添加内容或从中删除内容的成本非常高 链表在任何地方添加或删除项目以及进行迭代都非常便宜,但随机访问是O(n)。当: 您需要从列表中进行恒定时

我使用了很多列表和数组,但是我还没有遇到一种场景,在这种场景中,数组列表不能像链表一样容易地使用,如果不是比链表更容易的话。我希望有人能给我一些例子,当链表特别好的时候。

如果你需要在中间插入项目,不想开始调整数组大小和改变事物的话,列表的优势就出现了。p> 你是对的,通常情况并非如此。我有过一些非常具体的案例,但不是太多

阵列有O(1)个随机访问,但在其中添加内容或从中删除内容的成本非常高


链表在任何地方添加或删除项目以及进行迭代都非常便宜,但随机访问是O(n)。

当:

  • 您需要从列表中进行恒定时间的插入/删除(例如在实时计算中,时间可预测性是绝对关键的)

  • 您不知道列表中将包含多少项。对于阵列,如果阵列太大,可能需要重新声明和复制内存

  • 您不需要随机访问任何元素

  • > p>希望能够在列表中间插入项目(如优先级队列)

    当:

  • 您需要对元素进行索引/随机访问

  • 您可以提前知道阵列中的元素数,以便为阵列分配正确的内存量

  • 在按顺序遍历所有元素时,需要加快速度。您可以使用数组上的指针数学来访问每个元素,而您需要根据链表中每个元素的指针查找节点,这可能会导致页面错误,从而导致性能下降

  • 记忆是一个问题。填充数组比链表占用更少的内存。数组中的每个元素都只是数据。每个链表节点都需要数据以及指向链表中其他元素的一个(或多个)指针


  • 数组列表(如.Net中的列表)为您提供了数组的好处,但可以为您动态分配资源,这样您就不必太担心列表的大小,并且可以在任何索引中删除项目,而无需任何努力或重新排列元素。就性能而言,Arraylist比原始数组慢。

    嗯,Arraylist可以用于以下情况:

  • 您不确定将出现多少个元素
  • 但您需要通过索引随机访问所有元素

  • 例如,您需要导入和访问联系人列表中的所有元素(其大小您不知道)

    要添加到其他答案,大多数数组列表实现在列表末尾保留额外的容量,以便可以在O(1)时间内将新元素添加到列表末尾。当超过数组列表的容量时,将在内部分配一个新的、更大的数组,并复制所有旧元素。通常,新数组的大小是旧数组的两倍。这意味着,在这些实现中,向数组列表的末尾添加新元素通常是一个O(1)操作。因此,即使您事先不知道元素的数量,数组列表也可能比链表更快地添加元素,只要您在末尾添加元素。显然,在数组列表的任意位置插入新元素仍然是一个O(n)操作

    访问数组列表中的元素也比访问链表快,即使访问是顺序的。这是因为数组元素存储在连续内存中,可以轻松缓存。链表节点可能分散在许多不同的页面上


    如果您知道要在任意位置插入或删除项目,我建议您只使用链接列表。数组列表对于几乎所有其他内容都会更快。

    使用链表对数组进行基数排序和多项式运算。

    这些是最常用的集合实现

    阵列列表:

    • 在末尾插入/删除O(1)最坏情况O(n)

    • <> >插入/删除在中间O(n)

    • 检索任意位置O(1)

    链接列表:

    • 在任何位置O(1)插入/删除(如果您有对元素的引用,请注意)

    • < P>中O(n)

      检索
    • 检索第一个或最后一个元素O(1)

    矢量:不要用它。它是一个类似于ArrayList的旧实现,但所有方法都是同步的。对于多线程环境中的共享列表,这不是正确的方法

    HashMap

    按O(1)中的键插入/删除/检索

    树集 在O中插入/删除/包含(日志N)

    HashSet O(1)中的插入/删除/包含/大小如上所述,与ArrayList(O(n))相比,插入和删除操作在LinkedList中提供了良好的性能(O(1))。因此,如果应用程序中需要频繁添加和删除,则LinkedList是最佳选择


    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)