Java:LinkedList或int指针数据结构的替代品

时间:2012-08-17 10:50:07

标签: java pointers insert linked-list

由于LinkedList在内存开销方面是一场噩梦,在迭代元素时也很慢,我希望有类似int poiter数据结构的东西。

所以我有一个int列表,我通过在开头 - 中间插入元素来形成它。列表准备好后,我从左侧逐个迭代它。这是我的问题约束。

3 个答案:

答案 0 :(得分:3)

我会介绍并尝试不同的数据结构。

话虽如此,为什么不尝试使用ArrayList;迭代甚至插入都很快,而在 O(n)中,它很快,因为在缓存中移动连续数据是快速的。 (如果您在插入列表时也反转列表会更快!)


更新,因为我的其他程序员不明白为什么我推荐ArrayList来解决这个问题:

问题不是插入元素。在这种情况下,链表可以直接获胜(O(1)对阵列表的O(n))。 问题是要找到插入它们的地方。在这种情况下,LinkedList非常慢。找到要插入的地方有很大的开销,因为它没有在“好事”中分配内存。很多缓存未命中!

OP没有发布任何代码所以我们只知道OP想要什么,但这里是两种情况的算法分析(其中 C *是常量):

LinkedList,对于要插入的每个元素:

  • 迭代 O(C1 * n)
  • 插入 O(1)

ArrayList,对于要插入的每个元素:

  • 迭代 O(C2 * n)
  • 插入 O(C3 * n)

因此,两种算法都在 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:)