簡體   English   中英

單鏈表和雙鏈表之間是否有性能差異?

[英]Are there any performance differences between singly- and doubly-linked lists?

我們的作業要求我們證明Java LinkedList實現是雙鏈接而不是單鏈接。 但是,列表操作(例如添加元素,刪除元素和查找元素)對於這兩種實現似乎都具有相同的復雜性,因此似乎沒有一種方法可以使用性能參數來證明Java的雙鏈接性質。 LinkedList 有誰知道更好的方法來說明兩者之間的區別?

看一下在向前或向后方向上進行迭代,刪除“ before-last”元素,等等。

這很容易證明-您查看源代碼,看每個節點都有一個.previous指針:) http://www.docjar.com/html/api/java/util/LinkedList.java.html

考慮以下節點,單節點和雙節點。

class SingleLinkedNode {E數據; 接下來是SingleLinkedNode; }

class DoubleLinkedNode {E數據; DoubleLinkedNode上一個; 接下來是DoubleLinkedNode; }

如果我們想從DoubleLinkedList中刪除(假設我們已經找到該節點,這是非常不同的),我們該怎么做?

  1. 使刪除前的節點指向之后的節點。
  2. 使刪除后的節點指向之前的節點。

如果我們想從SingleLinkedList中刪除(假設我們已經找到該節點,這是非常不同的),我們需要做什么?

  1. 使刪除前的節點指向之后的節點。

您可能認為這意味着單個鏈接列表中的鏈接甚至比雙鏈接列表中的鏈接列表更快。

但是,如果我們之前沒有對該節點的引用,該如何刪除該節點? 我們只有下一個參考。 為了找到上一個,我們不必在列表上進行其他搜索嗎? :-O

Java List接口沒有允許您在不搜索鏈接列表的情況下刪除項目的方法。 它具有remove(int index),它將必須掃描列表以找到已索引的條目,它還具有remove(Object o),它也必須掃描列表。 由於鏈表實現可以在掃描時保存必要的前項輸入上下文,因此刪除對單鏈表和雙鏈表具有相同的復雜性。 此狀態也可以保存在迭代器中,因此Iterator.remove()不會更改此狀態。 因此,我認為您無法從刪除性能中看出什么。

我的猜測是對此的“正確”答案是創建多個不同大小的列表,並在搜索第一個或最后一個對象時計時.indexOf()和.lastIndexOf()的性能。 假設實現是雙向鏈接的,並且從列表的開頭搜索.indexOf(),然后從列表的末尾搜索.lastIndexOf(),則性能將取決於長度或與長度無關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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