簡體   English   中英

將現有元素添加到LinkedList之后添加新元素時的性能

[英]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 =元素的索引,而是列表的大小,但是對於問題)。 但是您是對的,它需要兩倍的時間並且效率低下。 我能想到的唯一方法是使用ListIteratorListIterator查找/插入(旨在進行這種操作)。

據我了解,此方法具有O(k2)行為,其中k表示元素K的位置。第一個indexOf()遍歷列表,直到找到K,然后add必須再次執行相同的工作,直到到達位置k + 1。

實際上,如果listLinkedList ,則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)


但是,你是對的。 可以使用addAfteraddBefore方法創建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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM