简化大O

问题描述

// Assume n is some random integer
int q = 1;
while (q <= Math.Sqrt(n))
{
   q++;
   int k = 1;
   while (k <= Math.Log(n,2))
   {
       k++;
       if (q^k == n){
          return true;
   }
}
return false;

在上面的代码中,我发现很难确定Big O在最坏的情况下将是什么。由于循环运行N次,而嵌套循环运行log2(N)次,我知道它应该是O(sqrt(n)* log2(n))次。但是,我发现如何简化它非常令人困惑。我知道sqrt(n)增长更快,但是我不确定是否可以忽略log2(n),因为它正在被倍增。如果我不忽略log2(n),则不确定它是否应为n ^ 2,因为它是n的两个项相乘,还是应该保留原样。

解决方法

简单点,认为外部的while循环执行了sqrt(n)次,而里面还有另一个while循环执行了log2(n)次,并且在其中假定所有操作花费O(1)时间来完成。被执行。
因此,我们有一个while循环执行了sqrt(n)次,其中有一个操作需要执行O(log2(n))(这是另一个while循环,将其视为黑盒pf,您知道它是渐近的)运行时间)。因此,该算法的复杂度为O(sqrt(n)log2(n))。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...