📅  最后修改于: 2023-12-03 15:11:08.403000             🧑  作者: Mango
在算法分析中,我们通常关心的是算法输入大小 n
非常大时,算法的复杂度。渐近符号(asymptotic notation)就是用来描述算法复杂度的符号。渐近符号不会给出精确的运行时间,但它们提供了一种清晰的方式来描述算法的速度,这在比较不同的算法时非常有用。
通常使用三种渐近符号:
大 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 符号,我们可以表示一些常见的复杂度如下:
大 Omega 符号表示算法的下界。也就是说,给出一个复杂度为 Ω(f(n)) 的算法,保证算法的复杂度不会低于 f(n)。
当然,我们也可以使用 O(n^2) 来描述上面例子中算法复杂度的时间下界,因为无论什么情况下,总要花费2n^2的时间。对于一个复杂度为 O(n log n) 的算法来说,它的下界就是 Ω(n log n)。
大 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 符号表示算法的紧密界。对于算法分析来说,掌握渐近符号对于比较不同算法的速度非常有帮助。