Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 计算嵌套循环的大O_C++_Algorithm_Big O_Time Complexity - Fatal编程技术网

C++ 计算嵌套循环的大O

C++ 计算嵌套循环的大O,c++,algorithm,big-o,time-complexity,C++,Algorithm,Big O,Time Complexity,我在为下面的代码计算大O时遇到问题。我从来都不是最聪明的人。 有人能解释一下吗。由于嵌套循环,我猜这里是O(N^2),但我知道还有更多 static inline int f1 (int a, int b) { for (int c = 0; c < b; c++) { a -= n; } return a; } int f2 (int n) { int r = n * n * n; for (double i = n; i >= 0; i -= 2)

我在为下面的代码计算大O时遇到问题。我从来都不是最聪明的人。 有人能解释一下吗。由于嵌套循环,我猜这里是O(N^2),但我知道还有更多

static inline int f1 (int a, int b)
{
 for (int c = 0; c < b; c++)
 {
   a -= n;
 }
 return a;
}

int f2 (int n) 
{
  int r = n * n * n;
  for (double i = n; i >= 0; i -= 2)
  {
     r = f1(r, i);
  }
  return r;
}
静态内联int f1(int a,int b)
{
for(int c=0;c=0;i-=2)
{
r=f1(r,i);
}
返回r;
}

首先,请注意f1的运行时完全取决于第二个参数,该参数控制循环迭代次数。因此,它的运行时间在第二个参数中是线性的

接下来,请注意f2中的循环运行n/2次,i的值为0、2、4、6、…、n。由于i是f1的第二个参数,因此运行时由

0+2+4+…+n

=2(0+1+2+n)

=2Θ(n^2)

=Θ(n^2)

所以运行时是Θ(n^2)。请注意,几乎所有其他事情都是为了误导你而分心。只关注控制迭代和循环的变量会揭示出您需要关注的实际逻辑

希望这有帮助

  • 请尝试避免循环计数器的浮点/双as,因为它们不精确。使用size\u t或任何其他int类型。此外,据我从代码中所知,不管怎样,您都可以将I从double转换为int,所以这里不需要这个double

  • 您的循环可以这样编写:

    int r = n * n * n;
    for (double i = n; i >= 0; i -= 2)
    {
      for (int c = 0; c < i; c++)
      {
        r -= n;
      }
    }
    
    intr=n*n*n;
    对于(双i=n;i>=0;i-=2)
    {
    对于(int c=0;c
  • 外循环:O(n/2)-它在每个步骤“跳跃”2个单位=>操作数为n/2

    内部循环:O(n/2)-从技术上讲,它迭代到i,但由于i的最大值为n/2,并且内部循环以1乘1的速度递增=>复杂性是相同的n/2

    整体复杂度:O((n/2)^2)

    更新


    正如其他人所建议的,是的,您可以折叠常量部分(在本例中为“/2”),但在我看来,这与我最初发布的内容更为清晰。希望这也能有所帮助。

    从数学上讲,你可以像下面这样正式地进行:

    其中op是在
    f1()
    中执行的恒定时间op操作数。 我本可以为
    f2()
    添加
    op'
    或类似的内容,但这似乎没有必要


    要计算运算的次数,比如T(10),只需让O((N/2)^2)不是一件事。在计算O时,你可以去掉/折叠常数。我认为没有比这更重要的了。我认为,计算大O符号是非常直观的。+1和第二到第三行是通过认识到1+2+3+…+n是(你在英语中称之为?)来完成的。它归结为1+2+3+…+n与
    n*(n+1)/2相同,它与
    n^2
    成比例缩放。