[英]Performance when adding new elements after existing ones to a LinkedList
假設我們有一個包含數百個元素的java.util.LinkedList。 在現有元素K之后插入新元素E的一種可能性是:
list.add(list.indexOf(K) + 1, E);
據我了解,此方法具有O(k 2 )行為,其中k表示元素K的位置。第一個indexOf()遍歷列表,直到找到K,然后add必須再次執行相同的工作,直到到達位置k +1。但是在第一步之后,可以輕松確定需要修改的條目。 我認為創建具有O(k)行為的方法addAfter(K,E)不需要太多工作。
除了切換到java.util.ArrayList之外,還有沒有辦法在這種情況下提高性能?
先感謝您。
您的假設是錯誤的,它是O(k ^ 2),它的O(2k)就是O(k)(順便說一句,這里不是k =元素的索引,而是列表的大小,但是對於問題)。 但是您是對的,它需要兩倍的時間並且效率低下。 我能想到的唯一方法是使用ListIterator
並ListIterator
查找/插入(旨在進行這種操作)。
據我了解,此方法具有O(k2)行為,其中k表示元素K的位置。第一個indexOf()遍歷列表,直到找到K,然后add必須再次執行相同的工作,直到到達位置k + 1。
實際上,如果list
是LinkedList
,則list.add(list.indexOf(K) + 1, E)
的成本為O(k)
。
list.indexOf(K)
調用涉及k
鏈接遍歷和k
比較。
list.add(k + 1, E)
調用涉及k + 1
鏈接遍歷。
加起來3 k + 1
運算; 即O(k)
。
但是,你是對的。 可以使用addAfter
或addBefore
方法創建LinkedList
的替代版本。 這些方法也將是O(k)
但是它們應該更快。 不幸的是, LinkedList
的實現方式不允許您簡單地添加這些方法(並以最佳方式實現)。 LinkedList
的內部被聲明為私有,因此您需要重新開始。
順便list.add(list.indexOf(K) + 1, E)
ArrayList
上的list.add(list.indexOf(K) + 1, E)
將是O(N)
,其中N
是列表長度。 indexOf
步驟進行k
比較, add
步驟涉及移動N - k
元素。 Ergo N
運算和O(N)
此代碼示例將進行k次操作:
LinkedList<Integer> list = new LinkedList<Integer>();
for(int i=0;i<100;i++){
list.add(i);
}
Integer insert = 1001;
Integer before = 50;
for (ListIterator<Integer> iterator = list.listIterator(); iterator.hasNext();) {
Integer next = iterator.next();
if(next.equals(before)){
iterator.add(insert);
break;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.