Big O
文章目录
一、什么是Big O
Big O通过计算一个算法所需的执行时间来让我们判断一段代码的优劣程度。当程序的输入的规模不断地扩大后,程序执行的时间也会相应地增加,如下图所示,横坐标代表输入的数量,纵坐标代表程序执行操作的次数(相当于执行时间)。 可以看出随着输入的数量的增加,不同的算法的执行时间(图中不同的黑线)的增长趋势是不同的,这也就反映了对于同一个问题,不同算法的优劣程度(指数增长比线性增长要差)。
二、Big O符号
1. O(n)
如果有n个同一种商品,现在需要将所有的商品的标签印上合格的标志,那么我们可以写一个简单的for循环来解决。可以看出,如果商品的数量是100个,那么整个程序就需要执行100次,如果商品有500个,那么就是500次,如果商品有1000000个,那么就是1000000次,也就是程序执行的时间和输入的数量是呈线性关系的,就像y = x。在这里,我们用符号O(n)来代表这种关系。
2. O(1)
如果有n个同一种商品,现在需要将第一个商品的标签印上合格的标志。可以看出,如果商品的数量是100个,那么整个程序只需要执行1次,如果商品有500个,也是1次,无论输入有多少个程序都只执行一次。在这里,我们用符号O(1)来代表这种关系。这里需要注意的是O(1) 中的1不代表真正的数字1,而是代表常量,就像上面的例子改成需要将前两个商品打印合格的标志,那么也还使用O(1)来表示这种关系, 而不是O(2)。
3. O(n^2)
当程序执行时间与输入的规模呈指数关系,那么就用O(n^2)来表示。常见的例子就是两个for循环嵌套。
4. 其他符号
利用相同的规则我们还有其他的Big O符号,它们是:O(log n),O(n*log(n)),O(2^n),O(n!)。这些内容将在后面的数据结构和算法内容遇到。
5. Big O计算与简化
假设现在有这样一段代码(循环都是完全被执行):
int a