对于一个项目,我需要编写一个方法,使用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次。
我的教授往往对指示非常含糊,而且在接触问题时非常无益。所以,我不知道我的代码是否被破坏,或者他是否被指南中的整数带走了。任何意见都表示赞赏。
答案 0 :(得分:1)
LinkedList
针对插入进行了优化,这是一个恒定时间操作。
搜索LinkedList
要求您迭代每个元素以找到所需的元素。您为get
方法提供了索引,但是在覆盖范围内,它正在遍历该索引的列表。
如果添加一些打印语句,您可能会看到第一个X元素的检索速度非常快,并且随着您将元素编入索引列表的下方而逐渐减慢。
ArrayList
(由数组支持)针对检索进行了优化,可以在恒定时间内索引所需元素。尝试更改代码以使用ArrayList
,并查看get
运行的速度有多快。
答案 1 :(得分:1)
考虑如何实现LinkedList
- 作为一个节点链 - 你会看到要到达一个特定的节点,你必须从头开始并遍历到该节点。
您在.get()
n 次上调用LinkedList
,这需要遍历列表,直到达到该索引。这意味着您的getTraverse()
方法需要O(n ^ 2)(或二次)时间,因为对于每个元素,它必须遍历(部分)列表。
正如Elliott Frisch所说,我怀疑你正在发现教练希望你发现的确切内容 - 不同的算法可能会有非常不同的运行时间,即使原则上他们做同样的事情。