Big O表示法Python函数

时间:2017-08-10 05:44:40

标签: python algorithm recursion time-complexity big-o

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)

3 个答案:

答案 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间接调用的总次数等于A8之前可以将其除以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)。