以下功能的时间复杂度是多少?

时间:2014-04-16 08:23:08

标签: c++ c algorithm

    int func(int n){
       if(n==1)
         return 0;
       else
         return sqrt(n);
    }

其中sqrt(n)是C math.h库函数。

  1. O(1)
  2. O(lg n)
  3. O(lg lg n)
  4. O(n)的
  5. 我认为运行时间完全取决于sqrt(n)。但是,我不知道这个功能是如何实际实现的。

    P.S。找到我所知道的数字的平方根的一般方法是使用牛顿方法。如果我没有错,使用牛顿法的时间复杂度证明是O(lg n)。答案应该是O(lg n)吗?

    P.P.S。在我最近出现的测试中得到了这个问题。

3 个答案:

答案 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))