[英]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.