总览
其他人给出了很好的图表示例,例如树形图。我没有看到任何简单的代码示例。因此,除了我的解释之外,我还将为某些算法提供简单的打印语句,以说明不同算法类别的复杂性。
首先,您需要了解对数的一般概念,您可以从https://en.wikipedia.org/wiki/Logarithm获得。自然科学用途e
和自然对数。工程弟子将使用log_10(对数为10),计算机科学家将大量使用log_2(对数为2),因为计算机是基于二进制的。有时,您会看到自然日志的缩写为ln()
,工程师通常不使用_10,而是直接使用,log()
而log_2则缩写为lg()
。所有类型的对数以相似的方式增长,这就是为什么它们共享相同的对数类别log(n)
。
当您看下面的代码示例时,我建议先看O(1),然后看O(n),再看O(n ^ 2)。当你对这些好之后,再看看其他的。我提供了一些干净的示例以及各种变体,以演示微妙的变化仍然可以导致相同的分类。
您可以将O(1),O(n),O(logn)等视为增长的类或类别。有些类别比其他类别需要更多时间。这些类别有助于为我们提供一种排序算法性能的方式。随着输入n的增长,某些增长更快。下表通过数值显示了上述增长。在下表中,将log(n)视为log_2的上限。
各种大O类别的简单代码示例:
O(1)-恒定时间示例:
算法1只打印一次hello,它不依赖于n,因此它将始终在恒定时间内运行,因此它是O(1)
。
print "hello";
算法2打印hello 3次,但是它不依赖于输入大小。即使随着n的增长,该算法也始终只会打印hello 3次。就是说3是一个常数,因此该算法也是O(1)
。
print "hello";
print "hello";
print "hello";
O(log(n))-对数示例:
算法3演示了在log_2(n)中运行的算法。注意for循环的后操作将i的当前值乘以2,因此i
从1到2到4到8到16到32 ...
for(int i = 1; i <= n; i = i * 2)
print "hello";
算法4演示了log_3。通知i
从1到3到9到27 ...
for(int i = 1; i <= n; i = i * 3)
print "hello";
算法5很重要,因为它有助于表明只要数字大于1并且结果与自身重复相乘,就意味着您正在寻找对数算法。
for(double i = 1; i < n; i = i * 1.02)
print "hello";
O(n)-线性时间示例:
该算法很简单,可以打出n次问候。
for(int i = 0; i < n; i++)
print "hello";
该算法显示了一种变体,它将打出n / 2次问候。n / 2 = 1/2 * n。我们忽略了1/2常数,并看到此算法为O(n)。
for(int i = 0; i < n; i = i + 2)
print "hello";
O(n * log(n))-nlog(n)示例:
这个作为组合O(log(n))
和O(n)
。for循环的嵌套可帮助我们获得O(n*log(n))
for(int i = 0; i < n; i++)
for(int j = 1; j < n; j = j * 2)
print "hello";
算法9与算法8相似,但是每个循环都允许变化,最终仍会导致 O(n*log(n))
for(int i = 0; i < n; i = i + 2)
for(int j = 1; j < n; j = j * 3)
print "hello";
O(n ^ 2)-n平方的例子:
O(n^2)
通过嵌套循环标准很容易获得。
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
print "hello";
类似于算法10,但有一些变化。
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j = j + 2)
print "hello";
O(n ^ 3)-n立方示例:
这类似于算法10,但具有3个循环而不是2个循环。
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
for(int k = 0; k < n; k++)
print "hello";
与算法12类似,但仍会产生一些变化O(n^3)
。
for(int i = 0; i < n; i++)
for(int j = 0; j < n + 5; j = j + 2)
for(int k = 0; k < n; k = k + 3)
print "hello";
摘要
上面给出了几个简单的示例,并通过各种变体来说明可以引入哪些细微的更改,这些更改实际上并不会改变分析。希望它能给您足够的见识。