rap*_*apt 5 algorithm tree binary-tree time-complexity binary-search-tree
为什么树排序 的平均案例时间复杂度是O(n log n)
?
来自维基百科:
向二叉搜索树添加一项平均是一个 O(log n) 过程(以大 O 表示法),因此添加 n 个项目是一个 O(n log n) 过程
但是我们不会每次都将一个项目添加到由 n 个项目组成的树中。我们从一棵空树开始,逐渐增加树的大小。
所以看起来更像
log1 + log2 + ... + logn = log (1*2*...*n) = log n!
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
原因O(log(n!)) = O(nlog(n))
是一个两部分的答案。一是扩大O(log(n!))
,
log(1) + log(2) + ... + log(n)
Run Code Online (Sandbox Code Playgroud)
我们在这里都可以同意log(1)
,log(2)
, 和所有数字log(n-1)
都小于log(n)
。因此,可以进行以下不等式,
log(1) + log(2) + ... + log(n) <= log(n) + log(n) + ... + log(n)
Run Code Online (Sandbox Code Playgroud)
现在答案的另一半取决于从 1 到 n 的一半数字大于 n/2 的事实。这意味着log(n!)
将大于n/2*log(n/2)
总和的前半部分log(n!)
,
log(1) + log(2) + ... + log(n) => log(n/2) + log(n/2) + ... + log(n/2)
Run Code Online (Sandbox Code Playgroud)
原因是,前半log(1) + log(2) + ... + log(n)
是log(1) + log(2) + ... + log(n/2)
,其小于n/2*log(n/2)
由第一不等式作为证明所以通过将总和的后半部分log(n!)
,可以表明,它是大于n/2*log(n/2)
。
所以有了这两个不等式,可以证明 O(log(n!)) = O(nlog(n))