Big O标记运行时:破解编码面试示例

时间:2018-08-16 02:22:54

标签: recursion runtime big-o coding-efficiency

我主要只是想确认我的理解。以下来自“破解编码面试”的big-o符号问题。答案键说运行时是“ O(b)或O(n)。递归代码通过b次调用进行迭代,因为它在每个级别上减去一个。”

因此,我知道函数power(a,b-1)的部分等于O(b)或O(n)。 然后“ a * power(a,b-1)”行中的第一个“ a”是常数吗?

我知道,当我们有一个像O(constant * b)之类的big-o时,就必须舍弃常数,而它变成O(b)。

int power(int a, int b){ 
    if(b < 0)
       return 0; //error
    else if(b == 0)
       return 1; 
    else
       return a * power(a, b-1)
 }

2 个答案:

答案 0 :(得分:1)

您的power函数只是计算某些输入整数a的幂,将其提高到b的幂。它是通过简单地将a乘以b倍,然后返回该值来实现的。函数调用的数量实际上与a的值无关,而仅与b的值有关。因此,此函数的行为类似于O(b)。我们还可以将b重命名为n,并将其命名为O(n),这可能是您可能会看到的。

答案 1 :(得分:0)

我认为,解释这一点的最清晰方法是指出“ a”是变量。您没有多次执行计算机指令“ a”。

您还可以看到“ b”也是一个变量。但是在“ b”的情况下,它还控制递归函数被调用的次数。因此,您确实必须执行一些计算机指令“ b”次。只要该值是常数,多少条指令都无关紧要。您的程序没有其他变量会影响执行的指令数量。

因此,假设您的n = b,您的函数是O(b)或O(n)(因为这是影响程序完成时间的输入。)

请记住,这全都在于估计必须执行的指令数。