让我们首先澄清当前背景下的“大O符号”是什么。可以从(
source)中读到以下内容:
引用:
大O符号是一种数学符号,描述了函数在参数趋向于特定值或无穷大时的极限行为。(..)
在计算机科学中,大O符号用于根据输入大小增长时算法的运行时间或空间需求来分类。
以下陈述不准确:
引用:
例如,将n视为1,解决O(n log n)将是O(1 log 1)= O(0)。同样,O(n)将是O(1)吗?
不能简单地执行“O(1 log 1)” ,因为大O符号并不表示一个函数,而是具有某个渐近上界的
一组函数; 可以从
source中读到:
引用:
大O符号根据其增长速度表征函数:具有相同增长速率的不同函数可以使用相同的O符号表示。
非正式地说,在计算机科学的
时间复杂度和
空间复杂度理论中,人们可以将大O符号视为关于时间和空间最坏情况的算法分类。例如,
O(n)
:
引用:
如果算法的时间/空间复杂度为O(n),则称算法具有线性时间/空间或O(n)时间/空间。非正式地说,这意味着运行时间/空间最多随输入大小线性增加(
source)。
而
O(n log n)
则为:
引用:
如果T(n)= O(n log^k n)对于某个正常数k成立,则称算法在准线性时间/空间下运行; 如果k = 1,则是线性时间/空间(
source)。
从数学上讲,陈述如下:
引用:
我读到O(n log n)大于O(n)(..)
这句话不准确,因为正如之前提到的,
Big O
符号表示
一组函数集合。更准确的说法是
O(n log n)
包含
O(n)
。然而,通常这样放松措辞是用来量化(针对最坏情况)一组算法相对于另一组算法在其输入尺寸增加时行为的方式。要比较两类算法(例如,
O(n log n)
和
O(n)
),而不是
例如,取n=1时,求解O(n log n)将得到O(1 log 1)=O(0)。与此同时,O(n)将得到O(1)?
这实际上与O(n log n)>O(n)相矛盾
你应该分析两类算法在它们的输入大小(即n)在最坏情况下的行为方式;分析当
n
趋近于无穷大时。
![enter image description here](https://istack.dev59.com/2pnDQ.webp)
正如@
cem所指出的,在图像中"
big-O
表示绘制函数的渐进最小上界之一,并不是指集合
O(f(n))
"
您可以看到,在某个输入后,
O(n log n)
(绿线)比
O(n)
(黄线)增长得更快。这就是为什么(对于最坏情况)
O(n)
比
O(n log n)
更可取的原因,因为人们可以增加输入大小,前者的增长速度比后者慢。