JS【详解】时间复杂度

时间复杂度是从时间维度描述一段代码的复杂程度,由一段代码中执行频次最高的语句决定,用大O符号表述。

时间复杂度的分类

从低到高依次是:

  • 常数时间复杂度 O(1):无论问题规模如何变化,算法的运行时间都保持不变。

  • 线性时间复杂度 O(n):当输入规模n线性增加时,算法的运行时间呈现出线性增长趋势。

  • 对数时间复杂度 O(log n):当输入规模n呈指数增长时,算法的运行时间呈对数增长趋势。

  • 平方时间复杂度 O(n^2):当输入规模n线性增加时,算法的运行时间呈现出平方增长趋势。

  • 立方时间复杂度O(n^3):当输入规模n线性增加时,算法的运行时间呈现出立方增长趋势。

  • 指数时间复杂度 O(2^n):当问题规模成指数增长时,算法的运行时间将会急剧增加

O(1)

O(1) 不是说只执行1次,而是对常量级时间复杂度的一种表示法。一般情况下,只要算法里没有循环和递归,就算有上万行代码,时间复杂度也是O(1)

js 复制代码
(function () {
  console.log("你好");
})();
js 复制代码
// 时间复杂度还是 O(1)
(function () {
  console.log("你好");
  console.log("你好");
})();

O(n)

只有一层循环或者递归等,时间复杂度就是 O(n)

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

O(n^2)

嵌套循环的时间复杂度就是 O(n^2)

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

多种复杂度并列在一起时,只取执行次数最高的语句,即取最高项

js 复制代码
// 最终的时间复杂度以高的为准,是 O(n^2)
function test(n) {
  //   单循环的时间复杂度是 O(n)
  for (let i = 0; i < n; i++) {
    console.log(i);
  }
  //   嵌套循环的时间复杂度是 O(n^2)
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      console.log(i, j);
    }
  }
}

O(logn)

二分法的时间复杂度是 O(logn),以下两种情况都是。

js 复制代码
function test(n) {
  while (n > 1) {
    n = n / 2;
    console.log(n);
  }
}
js 复制代码
function test(n) {
  for (let i = 1; i < n; i = i * 2) {
    console.log(i);
  }
}

O(nlogn)

二分嵌套一个单循环,即时间复杂度O(nlogn)

js 复制代码
function test(n) {
  for (let i = 1; i < n; i = i * 2) {
    for (let j = 0; j < n; j++) {
      console.log(i, j);
    }
  }
}
相关推荐
Sammyyyyy36 分钟前
月之暗面 Kimi Code 0.4.0 发布,终端 AI 编码助手全面采用 TypeScript,实现毫秒级启动
前端·javascript·人工智能·ai·typescript·servbay
宋拾壹1 小时前
fastadmin列表中查看列表,并且添加增加相应的数据
javascript·php·fastadmin
云水一下2 小时前
Vue.js从零到精通系列(三):组件化基础——Props、Emits、插槽与生命周期
前端·javascript·vue.js
小糯米6012 小时前
JavaScript表达式与运算符
开发语言·javascript·ecmascript
体验家3 小时前
体验家 XMPlus 网页端问卷 SDK 技术解析:用几行 JavaScript 实现精准场景触发与防打扰机制
开发语言·前端·javascript
VidDown3 小时前
VidDown 工具站:视频分辨率技术
javascript·网络·编辑器·音视频·视频编解码·视频
小鹿软件办公3 小时前
倒计时开启:Chromium 宣布几周内将全面切断 MV2 扩展支持
开发语言·javascript·ublock origin
Csvn4 小时前
TypeScript:你以为安全的 `JSON.parse` 其实是颗雷 — 运行时类型安全实战
前端·javascript
触底反弹4 小时前
从 JS 引擎执行原理理解数据类型:栈内存、堆内存与作用域
javascript·数据结构·面试
橘子星4 小时前
深入理解线性数据结构:栈、队列与链表
前端·javascript