想象一下,有一个整数向量,从位置-infinite..2..1..0..1..2 .. +无限。
只有一个位置包含一个整数值1,其他位置将包含0,算法将找到包含整数值1的位置。
考虑“verifyDoor”方法O(1 )。
我已经提供了这个解决方案,我想知道我的分析是否正确。
我得出以下结果:
T(n)= 8n + 10
T(n)= O(n)
代码:
int findDoor(int[] wall){
if(verifyDoor(0)){ // 1
return 0; // 1
}
int p =1; // 1
while(1){ // n
if(verifyDoor(p)){ // n+1
return p; // n+1
}else{ // n+1
if(p>0){ // n+1
p=p*-1; // n+1
}else{ // n+1
p=(p*-1)+1; // n+1
}
}
}
}
考虑“n”向量长度
T(n)= 8n + 10(这将是每条指令运行的总次数)
T(n)= O(n)
答案 0 :(得分:2)
是的,它是O(n),但计算为8n + 10通常没有多大意义,因为某些操作需要比另一个更多的时间而你甚至都不知道它。
例如}else{
并不总是需要额外的时间,因为有些编译器只是实现" goTo",无论它是否跳转到"否则"分支或在if分支之后......
或者声明变量可以花费100个计时器而不是给它等值。
答案 1 :(得分:2)
O(N)?什么是n?你需要定义n。
如果n是门与位置0的距离,那么复杂度为O(n)。
这是因为,对于位置i的门,算法访问[ - | i |,| i |]中的每个位置一次(除了-i,如果我是正的),并且只有2 | i |或2 | i | + 1个这样的职位。每次访问需要O(1)时间。