【发布时间】:2017-05-10 17:58:39
【问题描述】:
我想分析使用 LinkedList 或 ArrayList 将 1 2 3 4 移动到 3 1 2 4(整数列表)。
我做了什么:
aux = arraylist.get(2); // O(1)
arraylist.remove(2); // O(n)
arraylist.add(0, aux); // O(n), shifting elements up.
aux = linkedlist.get(2); // O(n)
linkedlist.remove(2); // O(n)
linkedlist.addFirst(aux); // O(1)
那么,在这种情况下,我们可以说它们是相同的还是我错过了什么?
【问题讨论】:
-
尝试用一些非常大的数据集编写一个基准测试,看看行为是什么。只有四个元素,很难真正看出区别。
-
对于
arraylist.remove(2),您忘记了向下移动元素。元素的移动是一项非常昂贵的操作。在任何情况下,您都在混合本质上非常不同的操作(搜索和复制)的复杂性,因此在单一尺度上比较ArrayList和LinkedList没有多大意义。 -
您忽略的一件事是
remove()返回已删除的项目,因此对于您的链接列表,没有理由单独创建get()。你可以linkedlist.addFirst(linkedlist.remove(2)); -
@azurefrog 谢谢,这是一个很好的提示。我正在摆脱一个 O(n)
-
理论上你不能将元素以相反的顺序保存在 ArrayList 中,然后从最后一个到第一个读取,所以 addFirst 将成为一个简单的添加,并且因为列表已经有空间,所以复杂性将再次与 LinkedList 相同(但当然不太实用)。
标签: java algorithm arraylist linked-list complexity-theory