【问题标题】:Java ListIterator PerformanceJava ListIterator 性能
【发布时间】:2010-12-12 18:58:16
【问题描述】:

我正在阅读thread 这里关于 java ArrayList 和 LinkedList 的性能。 Mr Kevin Brock 的回答如下。

"链表添加并不总是O(1) [或者这应该说 addLast() 是 O(1)]。 仅当从 在 ListIterator 中。添加方法 在 Java 的 LinkList 实现中必须 如果添加,则搜索列表 不在头部或尾部。”

我不明白他所说的“只有通过 ListIterator 完成”是什么意思。这是否意味着在linkedlist中有一个数据结构保存每个索引的引用,并且一旦我们从某个索引中获取listiterator,listiterator就会立即返回,而无需遍历列表来查找该索引?

谢谢大家!

【问题讨论】:

    标签: java list iterator linked-list


    【解决方案1】:

    表示迭代器直接指向列表节点;因此通过 get(int) 访问将是 O(N),但 iterator.next() 将是 O(1)。后者有直接引用,不需要遍历任何东西;前者需要从列表头开始遍历。

    【讨论】:

    • 感谢 Staxman 的及时回答。那么这是否意味着 ListIterator 是与“链表”并行维护的东西来保存节点的引用?
    • @Abidi,是的。但是,我怀疑您正在做的事情可以通过另一种方式更有效地完成。通常,还有另一种方法可以完成需要做的事情,这样您就不必在随机位置插入列表。
    【解决方案2】:

    如果你添加到 ListIterator 指向的 LinkedList,它是 O(1)。这与添加到 LinkedList 的开头或 ArrayList 的结尾相同。

    【讨论】:

      【解决方案3】:

      注释指的是两个参数添加方法,[add(int,E)][1]。假设一个线性分布的索引,那么这将是 O(n),因为需要遍历列表以找到合适的节点。它不适用于add(E)

      [1]:http://download.oracle.com/javase/6/docs/api/java/util/LinkedList.html#add(int,E)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        • 2016-03-08
        • 1970-01-01
        • 1970-01-01
        • 2016-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多