为什么ArrayList在开始时插入元素比java中的LinkedList花费更多的时间
我认为ArrayList在开始时插入元素的复杂性很高,因为它将其余元素向右移动了一个位置。LinkedList最后必须插入元素,因为它必须遍历每个元素。因此,上述两个操作所花费的时间应该是可比较的,但实际上,当我这样做时,arraylist在开始时插入需要34057毫秒,LinkedList在结束时插入只需要41毫秒,而这两个操作都具有时间复杂性。为什么会这样 就空间复杂度而言,哪一个更好 这是我的密码为什么ArrayList在开始时插入元素比java中的LinkedList花费更多的时间,java,list,data-structures,arraylist,Java,List,Data Structures,Arraylist,我认为ArrayList在开始时插入元素的复杂性很高,因为它将其余元素向右移动了一个位置。LinkedList最后必须插入元素,因为它必须遍历每个元素。因此,上述两个操作所花费的时间应该是可比较的,但实际上,当我这样做时,arraylist在开始时插入需要34057毫秒,LinkedList在结束时插入只需要41毫秒,而这两个操作都具有时间复杂性。为什么会这样 就空间复杂度而言,哪一个更好 这是我的密码 public void timeTakenEnd(String name, List<
public void timeTakenEnd(String name, List<Integer> list) {
for (int i = 0; i < 1E5; i++) {
list.add(i);
}
long start = System.currentTimeMillis();
for (int i = 0; i < 1E5; i++) {
list.add(i);
}
long end = System.currentTimeMillis();
System.out.println("time taken for: " + name + " to insert elements in the end is " + (end - start));
}
public void timeTakenBeg(String name, List<Integer> list) {
for (int i = 0; i < 1E5; i++) {
list.add(i);
}
long start = System.currentTimeMillis();
for (int i = 0; i < 1E5; i++) {
list.add(0, i);
}
long end = System.currentTimeMillis();
System.out.println("time taken for: " + name + "to insert elements in the beginning is " + (end - start));
}
public static void main(String[] args) {
ArrayList<Integer> alist = new ArrayList<Integer>();
LinkedList<Integer> llist = new LinkedList<Integer>();
TimeComplexity demo = new TimeComplexity();
demo.timeTakenEnd("arrarylist", alist); //25 miliseconds on my machine
demo.timeTakenEnd("linkedlist", llist);//41 miliseconds on my machine
demo.timeTakenBeg("arraylist", alist);// 34057 miliseconds on my machine
demo.timeTakenBeg("linkedlist", llist); //60 miliseconds on my machine
}
}LinkedList是一个双链接列表。它记住它的第一个和最后一个元素,并允许在两个方向上遍历列表
因此,在末尾添加一个元素只是创建一个节点并分配最后一个、下一个和上一个指针的步骤。是O1
请注意,Java是开源的,源代码随JDK提供。您可以很容易地找到实现:
public boolean add(E e) {
linkLast(e);
return true;
}
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
LinkedList是一个双链接列表。它记住它的第一个和最后一个元素,并允许在两个方向上遍历列表
因此,在末尾添加一个元素只是创建一个节点并分配最后一个、下一个和上一个指针的步骤。是O1
请注意,Java是开源的,源代码随JDK提供。您可以很容易地找到实现:
public boolean add(E e) {
linkLast(e);
return true;
}
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
正如其名称和Javadoc所示,ArrayList是由数组在内部实现的 因此,插入项目涉及将其后面的所有项目向前移动一个位置
另一方面,LinkedList只需重定向项的引用即可插入新节点,因此其时间更加恒定。正如其名称和Javadoc所示,ArrayList在内部由数组实现 因此,插入一个项目需要将所有项目移到后面,向前移动一个位置
另一方面,LinkedList只需重定向项的引用即可插入新节点,因此其时间更恒定。数组列表使用连续存储,因此在开始插入时需要将所有现有元素上移一个,或者重新分配整个列表。只要链接设置正确,链表就可以将新元素放在任何位置。不需要移动列表中的其他元素,只需调整几个链接。数组列表使用连续存储,因此开头的插入要求将所有现有元素上移一个,或者重新分配整个列表。只要链接设置正确,链表就可以将新元素放在任何位置。不需要移动列表中的其他元素,只需调整几个链接。现在有意义了我不知道它在java中实现为双链接列表Thank mate现在有意义了我不知道它在java中实现为双链接列表Thank mate