我们的作业任务要求我们证明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