阅读 106

算法之空间复杂度

我们需要一个不用具体的测试数据来测试,就可以粗略地估计算法的执行效率的方法,以此来追求最低的算法复杂度,提升代码质量。 复杂度分为时间复杂度和空间复杂度。 在介绍时间复杂度之前,先说下大 O 复杂度表示法。

大 O 复杂度

所有代码的执行时间 T(n) 与每行代码的执行次数 n 是成正比的 可以用一个公式来表示这种关系:

T(n) = O(f(n))

  1. T(n):表示代码的执行时间

  2. n:表示数据规模的大小

  3. f(n):表示一个公式,像上面的 2n + 2(2n²+2n+3),表示所有代码执行的次数总和

  4. O:表示代码的执行时间 T(n) 与 f(n) 表达式成正比

这就是大 O 时间复杂度表示法

大 O 时间复杂度实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度,简称时间复杂度

由公式可以看出,当 n 很大时,比如达到 10000,甚至 100000,此时公式中的低阶、常量、系数三部分就可以忽略不计,那么刚刚两个示例的时间复杂度可以简化为: T(n) = O(n)T(n) = O(n²)

时间复杂度

  1. 一个函数用大 O 表示,比如 O(1),O(n)、O(logN)

  2. 定性描述该算法的运行时间

时间复杂度 从图中可以看到时间复杂度的类型有好多种,但我们只要熟悉常用的几种即可,O(1),O(n)、O(logN)
与 O(n²)。 以及各个表达式的执行时间快慢:

1 < log2n < √n < n < nlog2n < n2 < 2n < n! 复制代码

常量阶 O(1)

O(1) 不是指只执行了一行代码,而是常量级时间复杂度的一种表示方法,比如如下代码的时间复杂度就是 O(1),而不是 O(4)。

function sum() {   var i = 0;   i += 1;   var j = 1;   var sum = i + j; } 复制代码

一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是 Ο(1)。

线性阶 O(n)

循环执行了 n 次

for (let i = 0; i < n; i += 1) {     console.log(i) } 复制代码

O(1) + O(n) = O(n)

加法法则:总复杂度等于量级最大的那段代码的复杂度

O(n) 足够大时,O(1) 忽略不计

let i = 0; i +=1 for (let i = 0; i < n; i += 1) {     console.log(i) } 复制代码

O(n) * O(n) = O(n^2)

乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

for (let i = 0; i < n; i += 1) {     for (let j = 0; j < n; j += 1) {         console.log(i, j)     } } 复制代码

O(logN)

实际上就是求2的多少次方等于 n,如下图: 在这里插入图片描述

let i = 1; while (i < n) {     console.log(i)     i * 2; }


作者:webInRun
链接:https://juejin.cn/post/7026708721342349319


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐