Big o 您如何发现代码片段的算法复杂性?

Big o 您如何发现代码片段的算法复杂性?,big-o,asymptotic-complexity,Big O,Asymptotic Complexity,我不知道这是什么程序。我如何看待这一点,如何确定大O将是什么?解决问题的过程是什么 例1: for ( i = 1; i <= n; i++) for (j = 1; j <= n*3; j++) System.out.println("Apple"); 对于(i=1;i简单的回答是计算循环。如果没有循环,它是O常数,如果有一个,它是O(N),如果有两个嵌套循环,它是O(N平方),如果有三个,它是O(N立方) 然而,这只是一个简短的答案。你也可以有循环,每次迭代时将输入

我不知道这是什么程序。我如何看待这一点,如何确定大O将是什么?解决问题的过程是什么

例1:

for ( i = 1; i <= n; i++)
  for (j = 1; j <= n*3; j++)
    System.out.println("Apple");

对于(i=1;i简单的回答是计算循环。如果没有循环,它是O常数,如果有一个,它是O(N),如果有两个嵌套循环,它是O(N平方),如果有三个,它是O(N立方)

然而,这只是一个简短的答案。你也可以有循环,每次迭代时将输入减少一半,这是对数N项。你可以有病态的蛮力函数,尝试各种可能性,这些函数都是非多项式的。通常它们被大量使用递归来编写,而且问题在每次迭代中都很难解决递归步骤


请注意,库函数通常不是O常量,必须考虑到这一点。

Big-O度量效率。因此,假设您要循环一个大小为n的数组,并假设n为2000。O(n)这意味着您解决此问题的算法正在进行最坏情况下的2000总计计算。O始终是您算法的最坏情况。最佳情况下使用了其他符号。您还有Ω(n)和Θ(n)

查看以下内容,了解效率的差异:

非正式地:

“T(n)T(n)T(n)是O(f(n))O(f(n))O(f(n))”基本上意味着f(n)f(n)f(n)f(n)n)描述T(n)T(n)的上界

“T(n)T(n)T(n)是Ω(f(n))\Omega(f(n))Ω(f(n))”基本上意味着f(n)f(n)f(n)f(n)n)描述T(n)T(n)的下限

“T(n)T(n)T(n)是Θ(f(n))\Theta(f(n))Θ(f(n))”基本上意味着f(n)f(n)f(n)f(n)n描述了T(n)T(n)的精确界

对于简单的情况,一个很好的方法是插入几个简单的数字来表示n,看看会发生什么。因此,假设n的大小为10:

在示例1中:

for ( i = 1; i <= n; i++) //loop through this n times
  for (j = 1; j <= n*3; j++) for each of those n times, loop through 3*n times
    System.out.println("Apple"); //negligible time (O(1))
(i=1;i)的

for ( i = 1; i <= n; i++) //loop through this n times
  for (j = 1; j <= n*3; j++) for each of those n times, loop through 3*n times
    System.out.println("Apple"); //negligible time (O(1))