【发布时间】:2012-04-15 22:52:45
【问题描述】:
我正在优化排序的 LinkedList 的实现。
要插入一个元素,我会遍历列表并比较每个元素,直到获得正确的索引,然后中断循环并插入。
我想知道是否有任何其他方法可以在遍历列表的同时插入元素以将插入从 O(n + (n capped at size()/2)) 减少到 O (n)。
ListIterator 几乎是我所追求的,因为它的 add() 方法,但不幸的是,在列表中有元素等于插入的情况下,插入必须放在它们之后在列表中。要实现这个 ListIterator 需要一个它没有的 peek()。
编辑:我有我的答案,但无论如何都会添加这个,因为很多人还没有正确理解: 我正在寻找一个插入点 AND 插入,它的总和高于 O(n)
【问题讨论】:
-
为什么不使用 Multiset?
-
我不明白为什么迭代列表并在小于或等于插入元素的最后一个元素之后插入将具有超过 O(n) 的复杂性。在链表中,它基本上只是迭代,直到找到插入点(即 O(n)),然后在该点插入(即 O(1))。
-
另外:为什么不使用平衡二叉树而不是排序链表?这应该将插入成本降低到 O(log(n))(搜索插入点的成本)。
-
@Thomas 因为我遍历列表以查找索引,而 LinkedList.insert(index, element) 遍历列表以插入。
-
您的语句“优化排序的
LinkedList实现”包含至少两个内部矛盾。
标签: java list linked-list big-o doubly-linked-list