我的代码在这里:
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)
。我是对的吗?
答案 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)。