有人可以帮助大O符号吗?

时间:2010-04-25 19:50:07

标签: algorithm recursion big-o

void printScientificNotation(double value, int powerOfTen)
{
if (value >= 1.0  &&  value < 10.0)
{
    System.out.println(value + " x 10^" + powerOfTen);
}
else if (value < 1.0)
{
    printScientificNotation(value * 10, powerOfTen - 1);
}
else     // value >= 10.0
{
    printScientificNotation(value / 10, powerOfTen + 1);
}

}

假设imputs不会导致无限循环

我理解该方法的用途,但我无法找到表示方法的方法。 例如,如果value为0.00000009或9e-8,则该方法将调用printScientificNotation(value * 10,powerOfTen - 1);八次和System.out.println(值+“x 10 ^”+ powerOfTen);一旦。

因此e的指数递归调用它。但是我如何通过大O表示法表示这一点?

谢谢!

1 个答案:

答案 0 :(得分:1)

这是一个棘手的问题吗?该代码将对其某些输入无限递归(例如,value = -1.0,powerOfTen = 0),因此对于任何有限函数f(n),其运行时间不是O(f(n))。

修改:假设value > 0.0 ...

运行时间(或递归深度,如果您希望以这种方式查看)不依赖于powerOfTen的值,仅在value上。对于范围[1.0,10.0]中的初始输入value,运行时间是常数,因此O(1),对于[10.0,+ infinity中的value,除以{{1}每次递归调用直到value为止,因此运行时为O(log 10 value < 10.0))。可以对范围(0.0,1.0)中的value进行类似的参数,但请注意,对于这种情况,log 10 value为负。因此,您的最终答案可能涉及绝对值操作。然后,您可以考虑是否有必要在渐近复杂性分析的上下文中指定对数基数。希望你能从那里拿走它!