合并两个排序列表,下界

问题描述

使用决策树和您对 (a) 部分的答案,证明任何正确合并两个排序列表的算法都必须执行至少 2n − o(n) 次比较。

来自 (a) 部分的答案:将 2n 个数字划分为两个排序列表的 2n 种方法,每个列表有 n 个数字 (2n 超过 n)

h >= lg(2n)! / (n!)^2

= lg(2n!) - 2lg(n!)

= Θ(2nlg(2n)) - 2Θ(nlg(n))

= Θ(2n)

我不明白最后一步。怎么可能是 Θ(2n)?

解决方法

您可以将乘积的对数表示为单独对数的总和 (the first property here):

2*n*lg(2*n) = 2*n*(lg(2) + lg(n)) = 2*n*(1 + lg(n))

所以

2*n*(1 + lg(n)) - 2*n*lg(n) = 
2*n+ 2*n*lg(n)) - 2*n*lg(n) = 2*n

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...