代码效率低下

时间:2015-09-21 00:29:48

标签: java big-o

我的代码在这里:

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)。我是对的吗?

1 个答案:

答案 0 :(得分:3)

这是不正确的:你的方法都需要O(F *(N + F))时间,其中N是列表中元素的数量,F是你的nFills变量。< / p>

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

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