遍历Giant LinkedList

时间:2017-02-17 01:09:50

标签: java data-structures linked-list traversal

对于一个项目,我需要编写一个方法,使用listIterator遍历一个LinkedList填充500万个随机整数,然后使用LinkedList的get(index)方法遍历。

使用listIterator遍历它并没有问题,它在大约75ms内完成。然而,在尝试遍历500万个整数的get方法之后,我只是停止了大约1.5小时的运行。

我使用的getTraverse方法类似于下面的代码(例如,我的类与类中的其他方法分组并且是非静态的,但工作方式相同)。

public static long getTraverse(LinkedList<Integer> list) {
    long start = System.currentTimeMillis();
    for (int i = 0; i < linkedList.size(); i++) {
        linkedList.get(i);
    }
    long stop = System.currentTimeMillis();
    return stop - start;
}

这对于尺寸为50,500,500,50000的整数LinkedLists来说非常好,并且需要很长时间但是已经完成了500000次。

我的教授往往对指示非常含糊,而且在接触问题时非常无益。所以,我不知道我的代码是否被破坏,或者他是否被指南中的整数带走了。任何意见都表示赞赏。

2 个答案:

答案 0 :(得分:1)

LinkedList针对插入进行了优化,这是一个恒定时间操作。

搜索LinkedList要求您迭代每个元素以找到所需的元素。您为get方法提供了索引,但是在覆盖范围内,它正在遍历该索引的列表。

如果添加一些打印语句,您可能会看到第一个X元素的检索速度非常快,并且随着您将元素编入索引列表的下方而逐渐减慢。

ArrayList(由数组支持)针对检索进行了优化,可以在恒定时间内索引所需元素。尝试更改代码以使用ArrayList,并查看get运行的速度有多快。

答案 1 :(得分:1)

考虑如何实现LinkedList - 作为一个节点链 - 你会看到要到达一个特定的节点,你必须从头开始并遍历到该节点。

您在.get() n 次上调用LinkedList,这需要遍历列表,直到达到该索引。这意味着您的getTraverse()方法需要O(n ^ 2)(或二次)时间,因为对于每个元素,它必须遍历(部分)列表。

正如Elliott Frisch所说,我怀疑你正在发现教练希望你发现的确切内容 - 不同的算法可能会有非常不同的运行时间,即使原则上他们做同样的事情。