我目前正在学习大O符号,但有一个概念令我感到困惑。如果对于8N ^ 2 + 4N + 3,复杂度等级将是N ^ 2,因为这是增长最快的术语。对于5N,复杂度等级为N.
那么说NLogN的复杂度类是N是正确的,因为N比LogN增长得快吗?
我试图解决的问题是,如果配置A包含一个快速算法,该算法需要5NLogN操作来对每秒运行10 ^ 6次操作的计算机上的列表进行排序,而配置B包含慢速算法它采用N ** 2操作对列表进行排序,并在每秒运行10 ^ 9次操作的计算机上运行。对于较小的阵列 配置1更快,但对于更大的阵列,配置2更好。这种过渡发生在什么尺寸的阵列上?
我想的是,如果我将表达式等于解决问题所花费的时间,那么我可以得到转换点的N但是产生了等式N ^ 2/10 ^ 9 = 5NLogN / 10 ^ 6这简化了到N / 5000 = LogN,这是不可解决的。
谢谢
答案 0 :(得分:2)
在数学中,对于在实数上定义的两个实值函数的f = O(g)
的定义是f(n)/g(n)
在n
接近无穷大时有界。换句话说,存在常量A
,对于所有n
,f(n)/g(n) < A
都存在。
在您的第一个示例中,(8n^2 + 4n + 3)/n^2 = 8 + 4/n + 3/n^2
在n
接近无穷大(例如15)时有界,因此8n^2 + 4n + 3
为O(n^2)
。另一方面,当nlog(n)/n = log(n)
接近无穷大时,n
接近无穷大,因此nlog(n)
不是O(n)
。然而它是O(n^2)
,因为nlog(n)/n^2 = log(n)/n
是有界的(它在无穷远处附近为零)。
至于你的实际问题,请记住,如果你不能象征性地解决方程,你可以随时用数字解决它。解决方案的存在是明确的。
答案 1 :(得分:1)
我们假设你的对数的底数是b,所以我们要比较
5N * log(b,N)
与
N ^ 2
5N * log(b,N)= log(b,N ^(5N))
N ^ 2 = N ^ 2 * log(b,b)= log(b,b ^(N ^ 2))
所以我们比较
N ^(5N),其中b ^(N ^ 2)
让我们比较它们并分析(N ^ 5N)/(b ^(N ^ 2))与1相比的相对值。您将观察到在一个限制后它小于1。
答案 2 :(得分:0)
问:NLogN的复杂度等级是N?
是否正确?答:不,这就是为什么我们可以忽略较小的术语:
考虑N ^ 2 + 1000000 N
对于N的小值,第二项是唯一重要的,但随着N的增长,这无关紧要。考虑比率1000000N / N ^ 2,其显示两个术语的相对大小。当N接近无穷大时,减小到10000000 / N,接近零。因此,随着N的增长,第二个词的重要性越来越小,实际上接近于零。
它不仅仅是'#34;更小,&#34;与足够大的N无关。
对于被乘数而言并非如此。 n log n总是显着大于n,余量继续增加。
答案 3 :(得分:0)
然后说NLogN的复杂度等级为N是正确的 因为N的增长速度比LogN快?
Nop,因为N和log(N)相乘而log(N)不是常数。
N / 5000 = LogN
大约55.000
答案 4 :(得分:0)
然后说NLogN的复杂度等级为N是正确的 因为N的增长速度比LogN快?
不,当你省略时,你应该省略一个术语。当你有NLgN时,它总体上称为术语。根据您的建议:N N N =(N ^ 2)* N.由于N ^ 2的增长率较高,我们省略了N.这完全是 WRONG 。顺序是N ^ 3而不是N ^ 2。 NLgN以同样的方式工作。只有在添加/减去术语时才会省略。 例如,NLgN + N = NLgN,因为它的增长速度比N快。
我试图解决的问题是,如果配置A包含 一种快速算法,它采用5NLogN操作对a上的列表进行排序 每秒运行10 ^ 6次操作的计算机和配置B. 由一个慢速算法组成,该算法需要N ** 2个操作来对列表进行排序 并在每秒运行10 ^ 9次操作的计算机上运行。对于 较小的阵列配置1更快,但对于较大的阵列 配置2更好。这个过渡的数量是多少 发生?
这不可能是真的。这是绝对的OPPOSITE。对于小N值,具有N ^ 2的更快的计算机更好。对于非常大的N,具有NLgN的较慢的计算机更好。
重点在哪里?那么,第二台计算机比第一台计算机快1000倍。因此当N ^ 2 = 1000NLgN时它们的速度相等,这解决了N~14,500。因此,对于N <14,500,N ^ 2将更快(因为计算机快1000倍)但是对于N> 14,500,较慢的计算机将更快。现在假设N = 1,000,000。速度更快的计算机需要的速度比计算机速度慢50倍,因为N ^ 2 = 50,000 NLgN,速度提高了1000倍。
注意:计算是使用Big O进行的,其中省略了常数因子。并且使用的对数是基数2.在算法复杂度分析中,我们通常使用LgN而不是LogN,其中LgN是log N到基数2而LogN是log N到基数10。
但是,参考CLRS(好书,我建议阅读它),Big O定义为:
请查看此图表以便更好地理解:
全部是关于N&gt;不。所以Big O表示法的所有规则对于N的大值都是有效的。对于小N,它不一定正确。我的意思是,对于N = 5,Big O不一定要近似于运行时间。
我希望这能为这个问题提供一个好的答案。
参考:第3章第1节,[CLRS]算法简介,第3版。