【问题标题】:java.util.LinkedList addLast() performancejava.util.LinkedList addLast() 性能
【发布时间】:2014-08-08 16:03:24
【问题描述】:

java.util.LinkedList 中的 addLast()、add() 或 offer() 等价方法的渐近复杂度是多少?是 O(N) 还是 O(1)?也就是说,LinkedList 是在内部保留指向其尾部的指针,还是从头部遍历列表?

无论哪种方式,您将如何使用在 offer() 方法中效率更高但仍使用标准库的 FIFO 队列具体实现? (没有自定义队列实现)。 LinkedList 是一个不错的选择还是别的什么?

我知道这个问题可能以前被问过,但是搜索了很长时间后我找不到答案。

【问题讨论】:

  • offer() 方法是什么?

标签: java linked-list queue


【解决方案1】:

是的,列表保留了一个指向尾部的指针,您可以在class JavaDoc 中阅读。

所有操作都按照双向链表的预期执行。索引到列表中的操作将从开头或结尾遍历列表,以更接近指定索引的为准。

因此像 addLast()add() 这样的操作需要 O(1) 时间。

文档特别说 LinkedList 适用于队列实现。

List 接口的链表实现。实现所有可选列表操作,并允许所有元素(包括 null)。除了实现 List 接口之外,LinkedList 类还提供了统一命名的方法来获取、删除和插入列表开头和结尾的元素。这些操作允许将链表用作堆栈、队列或双端队列

【讨论】:

  • 同意,addLast() ,add() 和 offer() 确实调用了相同的方法 linkLast(e);
  • 太棒了!所以,它实际上是一个双向链表实现。这就是我所缺少的......
  • 是的,LinkedList 有 Node first 和 Node last 变量来跟踪
【解决方案2】:

addLast()

O(1),Java只需要创建一个新节点并将其前一个节点值指向现在倒数第二个节点,然后将该节点的下一个节点值指向新创建的节点。

add()

如果您指定一个索引,O(N)(实际上是 N/2,因为它会根据您指定的索引从前面或后面遍历)。如果不指定索引,则 O(1),因为它与 addLast() 基本相同

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-08
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多