繁体   English   中英

从arraylist和linkedlist中删除最后一个元素时的时间复杂度

[英]Time Complexity while deleting last element from arraylist and linkedlist

第一部分: -

我在书中读到 - “Java中的数据结构和算法变得简单”,从Linkedlist和Arraylist中删除最后一个元素的时间复杂度是O(n)。 但是Linkedlist内部实现了DoublyLinkedlist,因此时间复杂度应为O(1),对于Arraylist来说类似,因为它在内部实现Array,它应该是O(1)。

第二部分: -

它还说在链表的末尾插入一个元素的时间复杂度为O(n),但是链表在末尾和前面都保持指针。 那么这句话是否正确? 此外,它表示如果数组未满,则在结尾处插入元素的时间复杂度为O(1),如果数组已满,则为O(n)。 为什么O(n)数组是否已满?

感谢您回答第1部分。 任何人都可以请解释第二部分。 谢谢 :)

这取决于你所采用的方法。

一瞥实现就会发现,如果你正在调用LinkedList.removeLast() ,那就是O(1)。 LinkedList维护指向列表中第一个和最后一个节点的指针。 因此,它不必遍历列表以到达最后一个节点。

使用最后一个元素的索引调用LinkedList.remove(index)也是O(1),因为它遍历最近端的列表。 [用户@andreas在下面的评论中注明。]

但是如果你正在调用LinkedList.remove(Object) ,那么就会对第一个匹配节点进行O(n)搜索。

类似地,对于ArrayList,如果您使用最后一个元素的索引调用ArrayList.remove(index) ,那么那就是O(1)。 对于所有其他索引,有一个System.arrayCopy()调用可以是O(n) - 但是完全跳过了最后一个元素。

但是如果你调用ArrayList.remove(Object) ,那么再次对第一个匹配节点进行O(n)搜索。

如果必须遍历所有记录以到达结尾,则删除链表的最后一个元素将采用O(n)。 但是双重链接的java.util.LinkedList的实现不仅仅保留对head的引用,而且还保留tail的引用并允许你在O(1)中删除last。 它以一种巧妙的方式实现,从开头或结尾遍历列表,以较接近指定索引为准

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM