与O混淆(1)

时间:2015-05-28 19:11:36

标签: algorithm time-complexity

我对O(1)在算法方面的含义有点困惑。算法有一个恒定的时间,但我不确定究竟什么是恒定时间。例如,我有两个算法

public void addOne(String string) {
    LinkedList tempList = new LinkedList();
    tempList.add(string);
    mainList.add(tempList);
    size[0]++;
}

public void addTwo(String string, String string2) {
    LinkedList tempList = new LinkedList();
    tempList.add(string);
    tempList.add(string2);
    mainList.add(tempList);
    size[1]++;
}

这两种算法都是O(1)吗?我假设如果有一个数值变量导致它循环n次,那么它会是O(n)吗?

即。 (不一定是一个实际的例子,因为在它中添加相同的字符串值,但应该给出一个想法)

public void add(String string, int n){
    LinkedList tempList = new LinkedList();
    for (int i=0; i<n; i++){
         tempList.add(string);
    }
    mainList.add(tempList);
}

3 个答案:

答案 0 :(得分:2)

您的观察结果是正确的 1

前两种方法都是O(1),因为你可以找到它必须做的操作次数的硬常量(这个常数可能在不同的机器之间变化,但它仍然是恒定的),并且因此它是O(1)

最后一种方法确实是O(n),因为您有n次插入,每次插入都需要一段时间,但它们在n中需要时间呈线性关系。

(1)假设mainList在O(1)中实现add(),否则 - 它将成为瓶颈。

答案 1 :(得分:1)

&#34; ......究竟什么才能成为一个恒定的时间。&#34;

如果你有一个函数或一个代码块,那么完成任务所需的时间永远不会超过某个常量,无论你传递给函数的参数是什么,或者容器中的数据量是多少(s)被操纵变化,然后该任务有资格作为恒定时间。

答案 2 :(得分:0)

请注意,Big O没有定义您的程序所需的时间,它只定义程序的增长率,即计算时间随着输入数量的增加而增加

在前两个示例中,即使增加输入数量,执行的语句数也保持不变。换句话说,即使您添加,例如示例2中的string3,可执行语句的数量仍然为5,使其计算保持不变。即其计算时间不会随着输入数量的增加而增加(与输入无关)。因此,它是O(1)。

但是,在第三个示例中,您使用的循环运行n次,n作为输入传递。因此,可执行语句的数量随着n线性增加。因此,如果将n传递为155,则执行变为大约是n为1时的155倍。因此,它是O(n)