📜  渐近符号以及如何计算它们(1)

📅  最后修改于: 2023-12-03 15:11:08.403000             🧑  作者: Mango

渐近符号以及如何计算它们

什么是渐近符号?

在算法分析中,我们通常关心的是算法输入大小 n 非常大时,算法的复杂度。渐近符号(asymptotic notation)就是用来描述算法复杂度的符号。渐近符号不会给出精确的运行时间,但它们提供了一种清晰的方式来描述算法的速度,这在比较不同的算法时非常有用。

通常使用三种渐近符号:

  • 大 O 符号
  • 大 Omega 符号
  • 大 Theta 符号
计算渐近符号
大 O 符号

大 O 符号表示的是算法的上界。也就是说,给出一个复杂度为 O(f(n)) 的算法,保证算法的复杂度不会超过 f(n)。这里的“不会超过”,是指当 n 越来越大时,算法的复杂度在某个常数 k 以内。

例如,对于一个算法的复杂度 $T(n) = 2n^2 + 3n + 4$ 来说,我们可以使用 O(n^2) 来描述它。因为当 n 足够大时,2n^2 + 3n + 4 这个式子中 2n^2 的部分的影响会越来越大,而 3n+4 这个式子对整个式子的影响越来越小,则可以忽略掉。

使用大 O 符号,我们可以表示一些常见的复杂度如下:

  • O(1):常数复杂度。
  • O(log n):对数复杂度。
  • O(n):线性复杂度。
  • O(n log n):如归并排序等经典排序的复杂度。
  • O(n^2):平方复杂度。
  • O(2^n):指数复杂度。
  • O(n!):阶乘复杂度。
大 Omega 符号

大 Omega 符号表示算法的下界。也就是说,给出一个复杂度为 Ω(f(n)) 的算法,保证算法的复杂度不会低于 f(n)。

当然,我们也可以使用 O(n^2) 来描述上面例子中算法复杂度的时间下界,因为无论什么情况下,总要花费2n^2的时间。对于一个复杂度为 O(n log n) 的算法来说,它的下界就是 Ω(n log n)。

大 Theta 符号

大 Theta 符号表示算法的紧密界。也就是说,给出一个复杂度为 Θ(f(n)) 的算法,保证算法的复杂度在上下界之间。因为限制是在上下两个方向,所以当且仅当渐近符号的上下界相同时,才能使用大 Theta 符号。

例如,快速排序的时间复杂度平均为 O(n log n),最好情况下为 O(n),最坏情况下为 O(n^2)。因为 O(n^2) 是 O(n log n) 的上界,O(n) 是 O(n log n) 的下界,所以快速排序的时间复杂度可以用大 Theta 符号表示为 Θ(nlogn)。

总结

渐近符号是描述算法复杂度的重要工具。大 O 符号表示算法的上界,大 Omega 符号表示算法的下界,大 Theta 符号表示算法的紧密界。对于算法分析来说,掌握渐近符号对于比较不同算法的速度非常有帮助。