int func(int n){
if(n==1)
return 0;
else
return sqrt(n);
}
其中sqrt(n)是C math.h库函数。
我认为运行时间完全取决于sqrt(n)。但是,我不知道这个功能是如何实际实现的。
P.S。找到我所知道的数字的平方根的一般方法是使用牛顿方法。如果我没有错,使用牛顿法的时间复杂度证明是O(lg n)。答案应该是O(lg n)吗?
P.P.S。在我最近出现的测试中得到了这个问题。
答案 0 :(得分:5)
我将给出一些更一般的案例答案,而不假设int
的大小不变。
答案是Theta(logn)
。
我们知道newton-raphson是Theta(logn) - 排除Theta(n)
(假设sqrt()
尽可能高效)。
但是,要编码的一般数字n
需要log_2(n)
位 - 您需要阅读所有内容才能获得准确的sqrt()
函数。这不包括Theta(1)
和Theta(log(log(n))
。
从上面我们知道函数的复杂性是Theta(log(n))
。
作为旁注,由于O(log(n))
是O(n)
的一个子集 - 它也是一个有效的答案,尽管不是紧张的答案。有关大Theta和大O及其差异的更多信息,您可能需要查看this thread。
答案 1 :(得分:2)
这取决于sqrt
的实施情况以及您感兴趣的时间复杂程度。
我会说你可以认为它是"常数",所以O(1),在这个意义上:如果你输入一个随机的int
,它将平均采取相同的多少时间。 (原因:有很多数字的数字更常见)。
但看看here。另一个可能的答案是O(M(n)),其中M(n)是乘法的复杂度,n是整数中的位数。
这看起来像是一本教科书问题而且可能意味着陷阱。老师或许想要检查一下你是否可以区分计算sqrt
的数字列表(可能是O(n))和一个数字(也就是O(1))。
请注意"正确"答案通常也取决于提出问题的背景。
答案 2 :(得分:2)
让n = 2 ^ m
给定T(n)= T(sqrt(n))+ 1
T(2 ^ m)= T(2 ^ m-1)+1
设T(2 ^ m)= S(m)
然后,
S(m)= 2S(m / 2)+1
使用主定理-
S(m)= theta(m)
= theta(log(n))
因此,时间复杂度为 theta(log(n))。