理解算法的时间复杂度

翻译:疯狂的技术宅javascript

原文:www.freecodecamp.org/news/time-c…前端

未经容许严禁转载java

理解算法的时间复杂度

在计算机科学中,算法分析是很是关键的部分。找到解决问题的最有效算法很是重要。可能会有许多算法可以解决问题,但这里的挑战是选择最有效的算法。如今关键是假如咱们有一套不一样的算法,应该如何识别最有效的算法呢?在这里算法的空间和时间复杂度的概念出现了。空间和时间复杂度是算法的测量尺度。咱们根据它们的空间(内存量)和时间复杂度(操做次数)来对算法进行比较。git

算法在执行时使用的计算机内存总量是该算法的空间复杂度(为了使本文更简短一些咱们不会讨论空间复杂度)。所以,时间复杂度是算法为完成其任务而执行的操做次数(考虑到每一个操做花费相同的时间)。在时间复杂度方面,以较少的操做次数执行任务的算法被认为是有效的算法。可是空间和时间复杂性也受操做系统、硬件等因素的影响,不过如今不考虑它们。算法

咱们将经过解决一个特定问题的例子来帮你理解时间复杂度,数组

这个问题是搜索。咱们必须在数组中查找一个元素(在这个问题中,假设数组已经按升序排序)。为了解决这个问题,咱们有两种算法:spa

  1. 线性搜索操作系统

  2. 二分搜索翻译

假设数组包含十个元素,要求咱们在数组中找到数字 10。code

const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const search_digit = 10;
复制代码

线性搜索算法会将数组的每一个元素与 search_digit 进行比较,当它在数组中找到 search_digit 时,会返回 true。如今让咱们计算它执行的操做次数。这里的答案是10(由于它比较了数组的每一个元素)。所以线性搜索使用十个操做来查找给定元素(这是使用线性搜索算法时对此数组的最大操做数,这也被称为最坏状况。一般线性搜索在最坏的状况下会进行 n 次操做(其中 n 是数组的大小)。

让咱们来看看一样状况下的二分搜索算法。

经过此图能够轻松理解二进制搜索:

资料来源:Learneroo

若是要在这个问题上应用此逻辑,那么首先咱们将 search_digit 与数组的中间元素进行比较,即 5。如今,由于 5 小于 10,那么咱们将开始在大于 5 的数组元素中寻找 search_digit ,不断执行相同的操做直到咱们找到所需的元素 10 为止。

如今试着计算使用二分搜索找到所需的元素进行的操做次数:大约须要四次操做。这是二分搜索的最坏状况。这代表,执行的操做数和数组的总大小之间存在对数关系。

操做次数 = log(10) = 4(约)

咱们能够将此结果推广到二分搜索: 对于大小为 n 的数组,二分搜索执行的操做数为:log(n)

Big O表示法

在上面的陈述中,咱们看到对于大小为 n 的数组,线性搜索将执行 n 次操做来完成查找,而二分搜索执行 log(n) 次操做(二者都是最糟糕的状况)。咱们能够将其表示为图形(x轴:元素数量,y轴:操做次数)。

资料来源:Techtud

从图中能够清楚地看出,线性搜索时间复杂度的增加速度比二分搜索快得多。

当咱们分析算法时,通常使用 Big O 表示法来表示其时间复杂度。

例如:线性搜索的时间复杂度能够表示为 O(n) ,二分搜索表示为 O(log n),其中,nlog(n) 是执行的操做次数。

下面列出了一些流行算法的时间复杂度或大O符号:

  1. 二分搜索: O(log n)
  2. 线性搜索: O(n)
  3. 快速排序: O(n*log n)
  4. 选择排序:O(n*n)
  5. 旅行商问题:O(n!)

结论

若是你读到了这里,我很是感谢。如今,必需要理解时间复杂性为什么如此重要?咱们知道,对于少许元素来讲(好比说10),二元搜索和线性搜索所执行的操做次数之间的差别并不大,但在现实世界中的大多数时候,咱们处理的是大块数据的问题。加入咱们有40亿个元素要搜索,那么在最坏的状况下,线性搜索将须要40亿次操做才能完成任务,而二分搜索只须要32次操做就能完成。它们之间的区别是很是巨大的。假设若是一个操做须要1毫秒才能完成,那么二进制搜索将只须要32毫秒,而线性搜索将花费40亿毫秒,也就是大约46天。这是一个显著的差别。这就是为何在涉及如此大的数据量时,研究时间复杂性是很是重要的缘由。

欢迎关注前端公众号:前端先锋,获取更多前端干货。

相关文章
相关标签/搜索