第一部分: -
我在书中读到 - “Java中的数据结构和算法变得简单”,删除Linkedlist和Arraylist中最后一个元素的时间复杂度为O(n)。但是Linkedlist在内部实现了DoublyLinkedlist,所以时间复杂度应该是O(1),类似于Arraylist,因为它在内部实现Array,它应该是O(1)。
第二部分: -
它还说在链表的末尾插入一个元素的时间复杂度为O(n),但链表在末尾和前面都保留了指针。那么这句话是否正确?此外,它表示如果数组未满,则在结尾处插入元素的时间复杂度为O(1),如果数组已满,则为O(n)。为什么O(n)数组是否已满?
感谢您回答第1部分。任何人都可以请解释第二部分。谢谢:))
答案 0 :(得分:12)
这取决于你打电话的方式。
对实现的一瞥表明,如果你正在调用LinkedList.remove(index)
,那就是O(1)。 LinkedList维护指向列表中第一个和最后一个节点的指针。因此,它不必遍历列表以到达最后一个节点。
使用最后一个元素的索引调用LinkedList.remove(Object)
也是O(1),因为它从最近端遍历列表。 [用户@andreas在下面的评论中注明。]
但是如果你正在调用ArrayList.remove(index)
,那么就会对第一个匹配节点进行O(n)搜索。
类似地,对于ArrayList,如果您使用最后一个元素的索引调用System.arrayCopy()
,那么那是O(1)。对于所有其他索引,有ArrayList.remove(Object)
调用可以是O(n) - 但是完全跳过了最后一个元素。
但是如果你打电话给$(document).ready(function(){
var date_input=$('input[name="date"]'); //our date input has the name "date"
var container=$('.bootstrap-iso form').length>0 ? $('.bootstrap-iso form').parent() : "body";
date_input.datepicker({
format: 'yyyy/mm/dd',
container: container,
todayHighlight: true,
autoclose: true,
})
})
,那么再次搜索第一个匹配节点的O(n)。
答案 1 :(得分:0)
如果必须遍历所有记录以到达结尾,则删除链接列表的最后一个元素将采用O(n)。但是双重链接的java.util.LinkedList的实现不仅仅保留对head的引用,而且还保留tail的引用并允许你在O(1)中删除last。 它以一种巧妙的方式实现,从开头或结尾遍历列表,以较接近指定的索引为准