实用的Java大o符号的例子
最后修改:2021年1月21日
1.概述
在本教程中,我们将讨论什么金宝搏官网188be大o表示法。我们将通过一些示例来调查其对代码的运行时间的影响。
2.大O表示法的直觉
我们经常听到使用的算法性能大o符号。
研究算法的性能 - 或算法复杂性 - 落入算法分析。算法分析回答了多少资源,例如磁盘空间或时间,算法消耗的问题。
我们将在作为资源的时间。通常,算法完成的时间越少。
3.恒定时间算法 -O(1)
算法的此输入大小如何影响其运行时间?理解大o的关键是了解事情可以增长的利率。这里有问题的速度是每个输入大小所花费的时间。
考虑这个简单的代码:
int n = 1000;system.out.println(“嘿 - 你的输入是:”+ n);
显然,它并不重要N是,上面。这段代码需要恒定的时间来运行。它不依赖于n的大小。
相似地:
int n = 1000;system.out.println(“嘿 - 你的输入是:”+ n);system.out.println(“嗯......我正在做更多的东西:”+ n);system.out.println(“更多:”+ n);
上面的例子也是恒定的时间。即使它需要3次才能运行,它不依赖于输入的大小,n。我们表示恒定的时间算法如下:O(1)。注意O(2)那o(3)甚至o(1000)会意味着同样的事情。
我们不关心运行需要多长时间,金宝搏官网188be只有它需要不断的时间。
4.对数时间算法 -o(log n)
恒定的时间算法(渐近地)最快。对数时间是下一个最快的。不幸的是,他们有点棘手的是想象的。
对数时间算法的一个常见示例是二进制搜索算法。要查看如何在Java中实现二进制搜索,点击这里。
这里重要的是运行时间以输入的对数成比例地增长(在这种情况下,日志到基数2):
for(int i = 1; i
如果N是8,输出将是以下内容:
嘿 - 我忙着看:1嘿 - 我忙着看:2嘿 - 我忙着看:4
我们的简单算法ran log(8)= 3次。
5.线性时间算法 -上)
在对数时间算法之后,我们得到下一个最快的类:线性时间算法。
如果我们说某些事情线性增长,我们的意思是它与其输入的大小成正比成正比。
想想一个简单的循环:
for(int i = 0; i
循环运行有多少次?N当然!我们不知道这是多长时间才能运行 - 我们不用担心。金宝搏官网188be
我们所知道的是,上面呈现的简单算法将随着其输入的大小而线性地生长。
我们更喜欢运行时间0.1n.比(1000n + 1000),但两者都是线性算法;它们都与他们投入的大小直接成比例地增长。
同样,如果算法更改为以下内容:
for(int i = 0; i
运行时仍将线性在其输入的大小中,N。我们表示线性算法如下:上)。
与恒定的时间算法一样,我们不关心运行时的细节。金宝搏官网188beo(2n + 1)是相同的上),正如大的那样,符合投入大小的增长涉及自己的增长。
6. n log n时间算法 -o(n log n)
n log n是下一类算法。运行时间成比例地增长n log n输入:
for(int i = 1; i <= n; i ++){for(int j = 1; j
例如,如果N是8,那么这个算法将运行8 * log(8)= 8 * 3 = 24时代。无论我们是否有严格的不平等,而不是在循环中都是无关的,因为它的符号是不相关的。
7.多项式时间算法 -上P.)
接下来我们有多项式时间算法。这些算法甚至慢于n log n算法。
术语多项式是含有二次的一般术语(N.2),立方体(N.3.),四分之一(N.4.)等等。功能。重要的是要知道的是什么上2)比它更快上3.)哪个比上4.), 等等。
让我们来看看二次时间算法的简单示例:
for(int i = 1; i <= n; i ++){for(int j = 1; j <= n; j ++){system.out.println(“嘿 - 我忙着看:”+ i +“和”+ j);}}
此算法将运行8.2= 64.时代。注意,如果我们要嵌套另一个循环,这将成为一个上3.)算法。
8.指数时间算法 -o(K.N)
现在我们进入危险的领土;这些算法与输入大小指数指数的某些因素成比例地生长。
例如,o(2N)算法双倍额外输入。因此,如果n = 2,这些算法将运行四次;如果n = 3.,它们将运行八次(种与对数时间算法的相反)。
o(3.N)算法三倍与每次额外输入,好的N)每次额外输入都将获得速率逐渐更大的算法。
让我们看看一个简单的例子o(2N)时间算法:
for(int i = 1; i <= math.pow(2,n); i ++){system.out.println(“嘿 - 我忙着看:”+ i);}
此算法将运行28.= 256.时代。
9.因子时间算法 -上!)
在大多数情况下,这几乎就像它一样糟糕。这类算法具有与之成比例的运行时间阶乘输入大小。
一个经典的例子正在解决旅行推销员使用蛮力方法解决问题。
对旅行推销员问题的解决方案的解释超出了本文的范围。
相反,让我们看看简单上!)算法,如上一节:
for(int i = 1; i <= armanial(n); i ++){system.out.println(“嘿 - 我忙着看:”+ i);}
在哪里因子(n)简单地计算n !.如果n是8,则该算法将运行8!= 40320.时代。
10.渐近功能
大o是所谓的渐近功能。所有这一方法都是它涉及算法的性能在极限- 即 - 当大量的输入被抛出时。
Big O并不关心您的算法如何使用小尺金宝搏官网188be寸的输入。它涉及大型输入(思考排序一百万号的列表与排序5个数字列表)。
另一件事要注意还有其他渐近功能。大θ(θ)和大ω(omega)还描述了限制的算法(记住,极限这只是为了巨大的投入方式)。
要了解这3个重要功能之间的差异,我们首先需要知道大O,大θ和大Ω中的每一个描述a放(即元素集合)。
在这里,我们的集合成员本身是算法:
- 大o描述了运行的所有算法集没有更糟糕的比一定的速度(这是一个上限)
- 相反,大Ω描述了运行的所有算法集没有更好的比一定的速度(这是一个下限)
- 最后,大θ描述了运行的所有算法集在一定的速度(它就像平等)
我们上面提出的定义不是在数学上准确的,但他们将有助于我们的理解。
通常,你会听到使用大o描述的事情,但在大Θ和大Ω上没有伤害。金宝搏官网188be
11.结论
在本文中,我们讨论了大o符号,以及如何了解算法的复杂性会影响代码的运行时间。
不同复杂性课程的良好可视化可以在这里找到。
像往常一样,可以找到本教程的代码片段在github上。