java - LinkedList - 使用 "get()"的迭代器来更快地迭代

标签 java collections linked-list iterator

我正在读这本书:Mark Weiss 的《Java 中的数据结构和算法分析》。有人可以解释一下在调用 get(i) 时使用迭代器如何减少运行时间吗?

书中的文本片段:

enter image description here

enter image description here

最佳答案

    Integer[] elements = new Integer[] { 4, 2, 7, 8, 1, 0, 3, 5, 9, 6 };

    List<Integer> arrayList = new ArrayList<>(Arrays.asList(elements));
    List<Integer> linkedList = new LinkedList<>(Arrays.asList(elements));

    for (int i = 0; i < elements.length; i++) { // Runs for O(n)
        Integer l1 = arrayList.get(i); // returns in O(1) 
        Integer l2 = linkedList.get(i); // returns in O(n)
    }
ArrayList

get(index) 直接从内存位置获取 index 处的元素。
因此,get(index)的时间为O(1)

LinkedList

get(index) 通过从 LinkedList 的头位置遍历列表来获取 index 处的元素。对于 LinkedList 的给定索引元素,没有可以预测的指定内存位置。
因此,get(index)的时间为O(n)

ArrayList 的总运行时间 = O(1) * O(n) = O(n)
LinkedList 的总运行时间 = O(n) * O(n) = O(n^2)

<小时/>

使用java.util.Iterator类

    Iterator iterator = arrayList.iterator();

    // total execution time: O(N)
    while (iterator.hasNext()) { // runs for each element iteratively
        System.out.print(iterator.next());
    }
    System.out.println();

    iterator = linkedList.iterator();

    // total execution time: O(N)
    while (iterator.hasNext()) { // runs for each element iteratively
        System.out.print(iterator.next());
    }
    System.out.println();

iterator.next() 只是迭代到 List 中的下一个元素。这样做的好处是我们不需要从链表的头部开始查找List Node迭代器类帮助您保留List当前节点位置的地址。

同样可以使用for-each as iterator来实现,它具有更简单的代码实现。

    for (Integer I : arrayList) { // runs for each element: total execution time: O(N)
        System.out.print(I); // gets in O(1)
    }

    System.out.println();

    for (Integer I : linkedList) { // runs for each element: total execution time: O(N)
        System.out.print(I); // gets in O(1)
    }

因此使用迭代器,
ArrayList 的总运行时间 = O(n)
LinkedList 的总运行时间 = O(n)

关于java - LinkedList - 使用 "get()"的迭代器来更快地迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43314846/

相关文章:

java - 并发框架中shutdownNow的使用

scala - 创建 `collection.mutable.SortedSet` -- `map` 方法中的歧义

java - ArrayList 中的异常示例?

java - 如何提高 Java ArrayList 的性能

c - 交换双链表中的节点

java程序有条件地从文件中读取行

java - 从 Controller 加载不同的 FXML 文件

java - Apache StrTokenizer 如何转义字符串文字中的引号和逗号

java - 选择排序双向链表java

c - 搜索 - BST- 获取段错误