我刚刚发现了一个奇怪的事实,在普通的数学中,n*logn 将小于 n,因为 log n 通常小于 1。
那么为什么 O(nlog(n)) 大于 O(n) 呢?(即为什么认为 nlogn 花费的时间更长)
大 O 表示法遵循不同的系统吗?
我刚刚发现了一个奇怪的事实,在普通的数学中,n*logn 将小于 n,因为 log n 通常小于 1。
那么为什么 O(nlog(n)) 大于 O(n) 呢?(即为什么认为 nlogn 花费的时间更长)
大 O 表示法遵循不同的系统吗?
原来,我误以为Logn小于1。
后来问了一些前辈,我今天才知道,如果n的值很大(通常在我们考虑最坏情况即Big O的时候),logn可能大于1。
所以,O(1) < O(logn) < O(n) < O(nlogn)是正确的。
(我本来认为这是个愚蠢的问题,准备把它删除,但是我后来意识到,没有愚蠢的问题,可能还有其他人会感到困惑,所以我把它留在这里。)
...因为log n始终小于1是一个错误的前提。
事实上,对于所有n > b,logb n > 1。例如,log2 32 = 5。
口语化地讲,您可以将log n视为 n 的位数。如果 n 是一个8位数字,则 log n ≈ 8。对于大多数的 n 来说,对数通常大于1,因为大多数数字都有多个位数。
在 Desmos (https://www.desmos.com/calculator) 或任何其他网站上画出函数图像并查看 n 较大时的结果 (y=f(n))。建议查看较大的 n 值,因为对于较小的 n 值,程序不会有时间问题。方便起见,我在下面附上了一个图表,您可以尝试其他以 log 为底数的情况。
其中红色代表时间 = n,蓝色代表时间 = nlog(n)。
在计算机领域,对数的底数为2而非10。因此log(2)等于1,而对于n>2时,log(n)是大于1的正数。 只有在log(1)的情况下,其值小于1,否则它的值都大于1。
如果 n 大于 b,那么 log(n) 可能大于 1。但这并不能回答你的问题,为什么 O(n*logn) 大于 O(n)。
通常情况下,底数小于 4。所以对于更大的 n 值,n * log(n) 就变得比 n 更大了。这就是为什么 O(nlogn) > O(n) 的原因。
n
值上表现如何,当 n
足够大时,它们将相互比较。理论上,存在一个 N
,对于每个给定的 n > N
,则有 nlogn >= n
。如果选择 N=10
,那么 nlogn
总是大于 n
。"Original Answer" 翻译成 "最初的回答"。对于log n的较高值,它变得大于1。由于我们考虑了所有可能的n值,我们可以说在大多数情况下log n大于1。因此,我们可以说O(nlogn) > O(n)(假设有更高的值)。
n>10
(以10为底),log n
都大于1。 - Bernhard Barkernlogn
中的log
是以 2 为底的。因此对于任何n >= 2
,都有logn >= 1
。就是这样... - Redu