Java Top.

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程

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上

Java底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程
评论在本文上关闭!