我們的作業任務要求我們證明Java LinkedList
實現是雙向鏈接的,而不是單鏈接的。然而,列表操作(例如添加元素,刪除元素和查看元素)在兩種實現中似乎都具有相同的複雜性,所以似乎沒有辦法使用性能參數來演示Java的雙向鏈接特性LinkedList
。任何人都知道更好的方式來說明兩者之間的區別?單鏈表和雙鏈表之間是否存在性能差異?
回答
看看向前或向後的迭代,刪除「before-last」元素,等等。
我們結束了查找前一個元素。這很好。謝謝! – 2011-02-24 01:33:15
考慮以下節點,單和雙。
class SingleLinkedNode E data; SingleLinkedNode next; }
class DoubleLinkedNode E data; DoubleLinkedNode prev; DoubleLinkedNode next; }
如果我們想從DoubleLinkedList中移除(假設我們已經找到了這個非常不同的節點),我們需要做什麼?
- 使節點在刪除 之前指向一個點。
- 將節點刪除後的一點指向之前的節點。
如果我們想從SingleLinkedList中刪除(假設我們已經找到了這個非常不同的節點),我們需要做什麼?
- 使刪除的點之前的節點成爲之後的點。
你會認爲這意味着它在單個鏈接列表中的速度比雙倍更快。
但是,如果我們沒有引用前面的節點,我們該如何刪除節點?我們只有對下一個的參考。我們不必爲了找到prev而在列表上進行其他搜索嗎? :-O
*「我們不需要在列表上完成其他搜索,只是爲了找到prev嗎?」*。其實沒有。單一鏈接列表的體面實現不會那樣做。 – 2011-02-24 01:32:25
@Stephen節點單鏈表如何在節點之前引用節點? – corsiKa 2011-02-24 01:38:41
當您遍歷列表以查找節點時,還保留對前一個節點的引用;即你剛剛打過的那個。所以你有這樣的東西:Node tmp = head,prev; while(node.data!= findItem){prev = tmp; tmp = tmp.next; }現在在循環之後(如果列表中的項)tmp是要刪除的節點並且prev是節點之前,因此prev.next = tmp.next;它消失了! ;-) – 2011-02-24 02:02:29
這是一個非常簡單的證明 - 你看看源代碼,並看到每個節點都有一個.previous
指針:) http://www.docjar.com/html/api/java/util/LinkedList.java.html
Java的List接口沒有一個方法,它允許你刪除項目而不搜索鏈接列表。它有remove(int index),它必須掃描列表以查找索引條目,並且它還具有remove(Object o),它也必須掃描列表。由於鏈表實現可以在掃描時保存必要的上一條目條目上下文,因此remove對於單鏈和雙鏈鏈表具有相當的複雜性。這個狀態也可以保存在一個迭代器中,所以Iterator.remove()不會改變它。所以我不認爲你可以從刪除性能中看出來。
我的猜測是,對此的「正確」答案是在搜索第一個或最後一個對象時創建多個不同大小和時間的列表,並查找.indexOf()和.lastIndexOf()的性能。假定實現是雙向鏈接的,並從列表開始處搜索.indexOf()並從結尾搜索。lastIndexOf(),性能將取決於長度或長度無關。
- 1. 差異在C和Java之間鏈表
- 2. concat和||之間是否存在性能差異?在oracle
- 3. saveAs()和exportDocument()之間是否存在性能差異?
- 4. 雙端鏈表和雙鏈表之間的區別
- 5. Linqs查詢表達式和點符號之間是否存在性能差異?
- 6. 「/\((.*)\)/」和「/ \(([^ \)] *)\)/」之間是否存在差異?
- 7. 在通過列添加創建的表之間是否存在性能差異?
- 8. 加入兩個索引表與外鍵之間是否存在性能差異?
- 9. 這兩個查詢之間是否存在性能差異?
- 10. 查看和存儲過程之間是否存在任何性能差異
- 11. C和C++之間的鏈接差異?
- 12. INSERT INTO表SELECT和SELECT INTO表之間的性能差異
- 13. 在Java中,新建和本地之間是否存在性能差異?
- 14. 單引號和雙引號html屬性之間的功能差異是什麼?
- 15. 是否存在兩個JSON之間差異的既定表示?
- 16. 數組和矩陣運算符之間是否存在性能差異?
- 17. 使用ScaleTransform和直接設置大小之間是否存在性能差異?
- 18. int和僅包含int的結構之間是否存在性能差異?
- 19. int i = 0和int i = default(int)之間是否存在性能差異?
- 20. Silverlight - C#和VB.net事件處理程序之間是否存在性能差異?
- 21. 循環RenderPartials和部分循環之間是否存在性能差異?
- 22. Javac調試開啓和關閉之間是否存在性能差異?
- 23. 二進制和XML序列化之間是否存在性能差異?
- 24. RenderPartial和Partial之間是否有任何大的性能差異?
- 25. 報表與表單之間的差異
- 26. 配置單元內部表和extenal表之間的性能差異
- 27. 單向鏈表到雙向鏈表
- 28. 從單鏈表到雙鏈表
- 29. jconn2和jconn3之間的性能差異
- 30. .exists之間的性能差異?和.where.present?
最終證明是閱讀源代碼。但我懷疑這就是這項任務所要求的:-) – 2011-02-24 01:11:44
@Stephen +1 - 有時候強力方法是最好的!在uni,我幫助我的室友用他的加密作業。問題是這是一個3字的Ceaser密碼。我說:「'那裏'這個詞有什麼可能呢?而且只有17k的可能性......」他的教授沒有留下深刻的印象,但是自從他證明他是如何做到的,他不得不信任他。他的代碼也比大多數短得多! – corsiKa 2011-02-24 01:15:31