foo(A)函数的大O是什么(其中n等于A的长度)? 据我所知,foo(4)语句对于递归的每次迭代都是O(1)。另外我理解foo(A // 8)语句的运行时间是对数的。
因此,程序的运行时间是bigO(log(n))吗?
此功能用于练习测试的运行时间。
def foo(A):
if A <= 6:
return 7
return foo(A//8) + foo(4)
答案 0 :(得分:3)
您的程序可以写成以下版本:
T(n) = T(n/8) + C
将Master theorem应用于 a = 1 且 b = 8
我们属于第二种情况:
n^(log(1) base 8) = n^0 = 1
C = ϴ(1).
==> T(n) = O(n^(log(a) base b) * log(n)) = O(n^(log(1) base 8) * log(n))
= n^0 * log(n) = 1*log(n) = O(log(n))
答案 1 :(得分:3)
A
不是向量而是整数,因此此问题中没有N
,复杂性必须以A
表示。
让我们用A=1000
模拟执行:
foo(1000)
calls foo(125) and foo(4), i.e.
calls foo(15) and foo(4), and foo(4), i.e.
calls foo(1) and foo(4), and foo(4), and foo(4).
你得到了模式。因此,foo
间接调用的总次数等于A
除8
之前可以将其除以6
以及最终调用的次数。
这正是Floor(Log8(Ceil(A/7)))+1
,确实是O(Log(A))
。
只是为了好玩:
如果你在八进制(基数8)中写A
,函数foo
计算7
乘以八进制数字的总和但最右边的加7
或{ {1}}(如果最后一位是14
)。
答案 2 :(得分:0)
您的分析是正确的。 log n
需要一段时间,您必须执行约O(log n)
(基数为8)次的操作 - 当然,public class SoundMeter {
private MediaRecorder mediaRecorder;
public void start(){
if(started){
return;
}
if (mediaRecorder == null){
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(
MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(
MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setAudioEncoder(
MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setOutputFile("/dev/null");
try{
mediaRecorder.prepare();
}catch (IllegalStateException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
mediaRecorder.start();
started = true;
}
}
}
public double getAmplitude(){
return mediaRecorder.getMaxAmplitude();
}
}
。
如果您更习惯使用公式,请使用Master Theorem进行验证(a = 1,b = 8,k = i = 0)。