代码效率低下

Inefficiency of the code

我这里有代码:

import java.util.*;

public class AddElements {

    public static void main(String[] args) {

        ArrayList<Integer> a = new ArrayList<Integer>();
        for(int i=1; i<=5; i++){
          a.add(i);
        }
        System.out.println(a);
        // [1, 2, 3, 4, 5]

        addElementAtBeginning(a, -1, 4);
        System.out.println(a);
        // [-1, -1, -1, -1, 1, 2, 3, 4, 5]    

       addElementAtBeginning(a, -2, 7);
        System.out.println(a);
        // [-2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, 1, 2, 3, 4, 5]
    }

    public static <T> void addElementInBeginning1(ArrayList<T> a, T fillElem, int nFills){
          for(int fills=0; fills<nFills; fills++){
               a.add(fillElem);
               for(int i=a.size()-1; i>0; i--){
               a.set(i, a.get(i-1));
          }
          a.set(0, fillElem);
        }
    }

    public static <T> void addElementAtBeginning2(ArrayList<T> a, T fillElem, int nfills){
        for(int i = 0; i < nfills; i++){
            a.add(0, fillElem);
        }
    }
}

两种方法产生相同的结果。问题在于它们的效率。 我只想确保第一种方法 addElementAtBeginning1() 采用 O(N^2)addElementAtBeginning2() 采用 O(N)。我说得对吗?

这是不正确的:您的两种方法都需要 O(F * (N+F)) 时间,其中 N 是列表中的元素数,F 是您的 nFills 变量.

addElementInBeginning1 需要 O(F *(N+F)) 的原因很简单:它有两个嵌套循环,一个在 nFills 上,另一个在 N 上,嵌套循环执行 O(1) 操作。运算结束时数组列表的大小为N+F.

addElementInBeginning2 花费 O(F *(N+F)) 的原因取决于实现中使用的数据结构:执行 nFills 次的循环的每次迭代都需要时间数据结构上。对于 ArrayList ,插入零的时间是 O(N)。对于链表,时间为 O(1),因此链表的总时间为 O(F)。