我目前正在学习算法课程中的大O符号,我偶然发现了困扰我的这个特殊问题。如果我们知道正式定义成立,我们可以将O(n lg(n))表示为c * n * lg n吗?意思是,如果f(n)< = c n lg n,并且定义适用于某些常数,那么O(n lg n)可以表示为c * n * lg n?如果我的假设是真的,那么我们可以这样做:
= lg(O(n lg n))
= lg(c * n * lg n)
= lg(c)+ lg(n)+ lg(lg(n))
如果lg(n)是这种情况下的最高阶项,那么这会简化为O(lg(n))吗?由于所有低阶项最终都会被最高阶项重叠?
答案 0 :(得分:2)
答案 1 :(得分:2)
你的问题有点难以理解。我想你在问:
假设我们有一个函数
f
渐近或小于O(n lg n)
的速度。函数lg ∘ f
是否渐近或小于O(lg n)
的速度?
是的,确实如此。
更新:评论员Paul Hankin指出了一个反例。也许这是对的?
假设我们有一个函数
的速率渐近渐增f
,它以O(n lg n)
的速率渐近渐近增长。函数lg ∘ f
是否以O(lg n)
我认为答案是肯定的。
答案 2 :(得分:0)
您正试图展示lg(O(n lg n)) = O(lg n)
。这有些非标准符号,但这意味着对于f
中的所有O(n lg n)
,g
中的O(lg n)
都是log(f) = g
。这在维基百科上解释:https://en.wikipedia.org/wiki/Big_O_notation#Multiple_usages
这句话并不像写的那样真实。例如,f = 2^(-n)
位于O(n lg n)
,但lg(f) = -n
位于O(lg n)
。但如果我们将自己限制在大于f
的{{1}},那么它就是真的。
如果1
,那么f = O(n lg n)
就是c
所有n
,f(n) < cn lg n
。然后是lg(f(n)) < lg(c) + lg(n) + lg(lg(n)) = O(lg n)
。自lg(f(n)) > 0
起,我们就拥有lg(f(n)) = O(lg n)
。这基本上是您对问题的证明,对定义进行了一些额外的关注,并确保lg(f(n))
不大而且是负面的。