Algorithm 该算法计算平方根的运行时间

Algorithm 该算法计算平方根的运行时间,algorithm,time-complexity,Algorithm,Time Complexity,我有这个算法 int f(int n){ int k=0; While(true){ If(k == n*n) return k; k++; } } 我的朋友说它花了O(2^n)。我不明白为什么。在我看来,时间成本是O(n^2)。 此函数将在n^2次迭代后返回k=n^2值。我是Manuel的朋友, 你不考虑的是,输入N的日志长度(n)…如果我们认为输入长度等于n,则时间复杂度为n^2,但事实并非如此 让我们考虑 x=log(n)< /强>(输入的长度)

我有这个算法

int f(int n){
   int k=0;
   While(true){
      If(k == n*n) return k;
      k++;
   }
}

我的朋友说它花了O(2^n)。我不明白为什么。

在我看来,时间成本是O(n^2)。 此函数将在n^2次迭代后返回k=n^2值。

我是Manuel的朋友, 你不考虑的是,输入N的日志长度(n)…如果我们认为输入长度等于n,则时间复杂度为n^2,但事实并非如此

让我们考虑<强> x=log(n)< /强>(输入的长度),现在我们有了<强> n=2 ^(x)=2 ^(log n)=n</强>,到目前为止都是正确的。

现在,如果我们计算成本作为n的函数,我们得到n^2,但是n等于2^(x),我们需要计算成本作为x的函数(因为时间复杂度是根据输入的长度计算的,而不是根据值计算的),因此:

O(f)=n^2=(2^(x))^2=2^(2x)=O(2^x)
“在计算机科学中,大O表示法用于根据算法的运行时间或空间需求如何随着输入大小的增长而增长来对算法进行分类”()


这里有另一种解释,其中所讨论的算法是素性测试:

输入是n,while循环迭代是n*n,它是n^2,因此复杂性是O(n^2)

这是基于您的源代码,而不是标题

有关标题,请链接我的帮助,
我引用的答案是:
n位数字的平方根可在时间O(M(n))内使用牛顿迭代法计算,其中M(n)是两个n位整数相乘所需的时间。M(n)上的当前最佳界是n logn2^{O(log∗n) },由Fürer算法提供


您可以查看

的有趣条目,根据标题行,我认为它的成本为O(n^2),我希望这可以尝试计算参数
n
的平方根。相反,这是一种产生
n*n
的毫无意义的复杂方式。因此,给定一个参数n,函数只能返回n*n,如果它返回。。。听起来不是更像平方而不是平方根吗?它实际上是O(n^2),假设没有整数溢出等等…是的,这是非常糟糕的根。。。如果(k*k>=n)返回k,则平方根(向上舍入)将是
而不是您的
如果(k==n*n)返回k同样,komplexity也不是那么容易,因为我们不知道int是什么(因为您没有指定语言/平台
n
range)。。。如果它是基本类型,那么对于sqrt,它将是
O(sqrt(n))
,对于您的sqr,它将是
O(n^2)
。然而,如果它是bignum类型,那么它将更加复杂,因为乘法不再是
O(1)
,它也将取决于它的实现……当涉及到复杂性时,不允许发表意见:或者你可以证明它是O(N^2),在这种情况下,你应该给出证明,或者你只是猜测,猜测不是答案。算法中没有
x
,big-O是相对于输入计算/导出的,这里的输入是
n
。你凭什么相信big-O是围绕输入的长度而不是值旋转的?这取决于循环的迭代次数,它与
n
的值成正比,而不是它的长度。我猜我已经错误地教了35年多了。嘿!算了吧@g1lf0yl3我猜你的老师和Manuel正在讨论不同的代码。我怀疑你听错了或误解了教授的解释。我强烈建议你做我建议的实验。这里的关键概念是问题如何相对于输入进行扩展。如果将输入值加倍
n
需要4倍的迭代次数,那么复杂性是二次的。有更快的方法(即使是非近似的方法)。。。因为不需要乘法就可以找到整数sqrt,比如我不久前开发的这个,即使是那个也远远不是最快的。。。甚至还有众所周知的
O(1)
浮点解决方案(来自Quake3的IIRC)@Spektre,没有乘法的sqrt导致相同或更糟的复杂性,在您提供的链接中,算法使用二叉搜索树。除此之外,检查它,它表示的复杂度为2,等于n个位数的乘法。“C,C++,Python……等的方法被称为,Th StAdvExchange链接引用我认为的这个方法。它的复杂性是O(k^ 2 n^ 2 log(b))。众所周知的解决方案。如果有,请给我们链接。你提到的那个(IIRC地震3)或游戏《地震III竞技场》,是做快速平方根平均值1/sqrt(n)。它是输入的平方根反比的近似值。此近似值可通过使用根查找法(一种查找函数零点的方法)进行细化,该算法使用牛顿法。有关详细信息,请参阅