我对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);
}
答案 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)