由于LinkedList在内存开销方面是一场噩梦,在迭代元素时也很慢,我希望有类似int poiter数据结构的东西。
所以我有一个int列表,我通过在开头 - 中间插入元素来形成它。列表准备好后,我从左侧逐个迭代它。这是我的问题约束。
答案 0 :(得分:3)
我会介绍并尝试不同的数据结构。
话虽如此,为什么不尝试使用ArrayList
;迭代甚至插入都很快,而在 O(n)中,它很快,因为在缓存中移动连续数据是快速的。 (如果您在插入列表时也反转列表会更快!)
更新,因为我的其他程序员不明白为什么我推荐ArrayList
来解决这个问题:
问题不是插入元素。在这种情况下,链表可以直接获胜(O(1)对阵列表的O(n))。 问题是要找到插入它们的地方。在这种情况下,LinkedList
非常慢。找到要插入的地方有很大的开销,因为它没有在“好事”中分配内存。很多缓存未命中!
LinkedList
,对于要插入的每个元素:
ArrayList
,对于要插入的每个元素:
因此,两种算法都在 O(n)中,但仔细观察常数: C1 非常大(如上所述)。另一方面, C2 和 C3 很小,因为在缓存中迭代和移动速度很快。
所以,如果你有足够的记忆力,试试ArrayList
!
答案 1 :(得分:2)
LinkedList
,那么 list.get(index);
确实有明显的表现
请改用ListIterator
,以便每次不会反复遍历列表时。
如果你需要在列表中间添加元素,它将比ArrayList
O(1)
具有更好的性能(因为你不需要移动元素)
更新:
迭代列表的正确方法是使用迭代器(隐式或显式)。使用隐式迭代器的示例:
for(E e:list){
}
从不执行:
for(int i = 0; list.size(); i++{
E e = list.get(i);
}
如果列表是LinkedList
,则此操作为O(N^2)
,因为list.get(i)
在循环的每次迭代中从头开始遍历列表。
由于迭代器“记住”访问的最后一个元素并从那里开始,因此使用带有迭代器的第一个表单只有O(N)
几乎与ArrayList
相同
答案 2 :(得分:0)
第1步:在LinkedList
第二步:将元素复制到ArrayList
进行迭代。
LinkedList
:)