以下函数的时间复杂度是多少

What is the time complexity of the following function?

本文关键字:多少 时间复杂度 函数      更新时间:2023-10-16
    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(

我认为运行时间完全取决于sqrt(n(。但是,我不知道这个功能实际上是如何实现的。

附言:据我所知,求一个数的平方根的一般方法是用牛顿法。如果我没有错的话,用牛顿方法计算的时间复杂度是O(lgn(。那么答案应该是O(lgn(吗?

p.p.S.在我最近参加的一次考试中得到了这个问题。

我将给出一个更一般的案例答案,而不假设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及其差异的更多信息,你可能想看看这个帖子。

这取决于sqrt的实现,也取决于您感兴趣的时间复杂性。

我想说,你可以认为它是"常数",所以O(1(,在这个意义上:如果你放入一个随机的int,它平均需要相同的时间。(原因:多数字的数字要常见得多(。

但请看这里。另一个可能的答案是O(M(n((,其中M(n是乘法的复杂度,n是整数中的位数。

这看起来像是一个课本上的问题,可能是一个陷阱。老师可能想检查你是否可以区分计算一系列数字的sqrt(它将是O(n((和一个数字(它将为O(1((。

请注意,"正确"的答案通常也取决于提问的背景。

设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(=θ(m(
=θ(log(n((
因此,时间复杂度是θ(log(n((