What is Big-O Notation? Understand Time and Space Complexity in JavaScript.

2025-06-08

什么是大 O 符号?理解 JavaScript 中的时间和空间复杂度。

我们知道,任何问题都可能有不止一个解决方案。但很难定义解决该编程问题的最佳方法。
当我们需要处理大量数据时,编写一个解决特定问题的算法会变得更加困难。我们如何编写代码中的每一种语法都至关重要。

有两个主要的复杂性可以帮助我们选择编写高效算法的最佳实践:

1. 时间复杂度——解决算法所需的时间

2. 空间复杂度——系统占用的总空间或内存。

当你编写一些算法时,我们会给机器下达一些指令去执行某些任务。而机器完成每项任务都需要一些时间。没错,时间很短,但仍然需要一些时间。所以,问题来了:时间真的重要吗?

举个例子,假设你尝试在谷歌上搜索某个问题,大约需要 2 分钟才能找到答案。通常情况下,这种情况不会发生,但如果发生了,你认为后端会发生什么?谷歌的开发人员了解时间复杂度,他们会尝试编写智能算法,以尽可能短的执行时间并尽快给出结果。

因此,这里出现了一个挑战,我们如何定义时间复杂度。

什么是时间复杂度?

它量化了算法所花费的时间。我们可以通过一个例子来理解时间复杂度的差异。

假设你需要创建一个函数,该函数接受一个数字并返回该数字到该数字的和。
例如 addUpto(10);
它应该返回 1 到 10 的数字和,即 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10;

我们可以这样写: 现在你应该明白为什么同一个函数对于不同的输入会花费不同的时间了。这是因为函数内部的循环会根据输入的大小来运行。如果传递给输入的参数是 5,循环会运行 5 次;但如果输入是 1000 或 10,000,循环就会运行那么多次。现在这有点道理了。
function addUpTo(n) {
let total = 0;
for (let i = 1; i <= n; i++) {
total += i;
}
return total;
}
addUpTo(5); // it will take less time
addUpTo(1000) // it will take more time

但是有一个问题,不同的机器记录的时间戳不同。因为我的机器处理器和你的不同,而且多个用户的情况也一样。

那么,我们如何衡量这个时间复杂度?

在这里,大 O 符号可以帮助我们解决这个问题。根据维基百科,大 O 符号是一种数学符号,用于描述函数在参数趋向于特定值或无穷大时的限制行为。使用字母 O 是因为函数的增长率也称为
函数的阶数。

根据大 O 符号,我们可以表达时间复杂度如下

  1. 如果复杂度随着输入线性增长,则意味着其为 O(n)。这里的“n”是算法必须执行的操作数。
  2. 如果复杂性随着输入不断增长,那么大 O 符号将为 O(1)。
  3. 如果复杂度随输入呈二次方增长,则大 O 符号将为 O(n^2)。您可以将其读作 O of n square
  4. 如果复杂性随着输入以指数的倒数增长,我们可以说。

对数算法

我们可以像下面这样简化这些表达式。基本上,在计算大 O 符号时,我们会尝试忽略较低的值,并尝试关注可以增加性能时间的最高因子。因此,

  1. 而不是 O(2n),更喜欢 O(n);
  2. 而不是 O(5n^2),最好是 O(n^2);
  3. 而不是 O(55log n),更喜欢 O(log n);
  4. 而不是 O(12nlog n),最好是 O(nlog n);

对数图像

为了更好地理解,请看一下我们日常使用的某些具有 O(n)、O(n^2) 和 O(log n) 复杂度的算法?

在 Quora 上,Mark Gitters 说,

O(n):按照购物清单中的顺序一次购买一件商品,其中“n”是清单的长度

O(n):假设检查购物清单的时间与步行时间相比微不足道,那么需要走遍每条过道(此处“n”是商店的长度)来购买购物清单上的物品

O(n):将两个十进制表示的数字相加,其中 n 是数字的位数。

O(n^2):尝试通过彻底尝试所有拼图块来找到两个可以拼在一起的拼图块

O(n^2):与房间里的每个人握手;但这是并行的,因此每个人只需做 O(n) 的工作。

O(n^2):使用小学乘法算法将两个数字相乘,其中 n 是位数。

O(log n):在覆盖 N 人的电话树中,每个参与者所做的工作量。不过,总工作量显然是 O(n)。

O(log n):通过逐步缩小范围,找到书签掉落的书中你停下来的地方

Arav 说,

如果你指的是我们在不编程时在日常生活中使用的算法:

O(log n):查找书中的某一页/字典中的某一单词。O
(n):查找并删除未读邮件中的垃圾邮件(例如新闻通讯、促销邮件)。O
(n ^ 2):按个人喜好顺序排列桌面图标(根据个人喜好,可以选择插入排序或选择排序)。

希望你现在已经熟悉了其中的复杂性。
这篇文章并没有结束这个主题,以后我会再写一篇。
如果你有任何问题或建议,请在评论区留言或随时联系我。

感谢您花费宝贵的时间阅读本文。

鏂囩珷鏉yu簮锛�https://dev.to/chandra/what-is-big-o-notation-understand-time-and-space-complexity-in-javascript-4684
PREV
具有拖放功能的响应式 React 文件上传组件
NEXT
如何在应用程序中处理 JWT?AWS 安全直播!