二分法采用五五分平均复杂度最小(相比四六分或三七分等)的定量证明方法
有一天晚上我深夜失眠,躺在床上辗转反侧,无法入睡。在床上滚来滚去,觉得十分无聊,不知怎么的想起了二分法。这是我们解决数据结构或算法问题中常用的一种divide and conquer的分治手段。但是二分法中的这个二,说的是把一个问题分解成两个子问题递归求解,并没有说明两个子问题要平均分。那么为什么通常大家都会进行平均的五五分配呢,应该是需要一个合适的理由的。
于是我在黑暗中瞪着眼睛开始想,好像想出了一个比较严谨的证明方法,po出来和广大网(喷)友(子)一起讨论,看看是不是有什么不合适的地方需要修改。首先给出结论:二分法采用五五分的平均复杂度是最小的, 下面给出一个定量的证明。
假设我们有一个规模为
n
n
n的问题,根据二分的思想,将其分为
α
n
\alpha n
αn和
(
1
−
α
)
n
(1-\alpha)n
(1−α)n两个部分,其中
0
≤
α
≤
1
0 \leq\alpha\leq1
0≤α≤1。用复杂度的期望来表征这个二分结果的平均复杂度,即:
f ( n ) ‾ = α f ( α n ) + ( 1 − α ) f ( ( 1 − α ) n ) = T ( α ) , 0 ≤ α ≤ 1 \overline{f(n)} = \alpha f(\alpha n) + (1-\alpha)f((1-\alpha )n) = T(\alpha), 0\leq\alpha\leq1 f(n)=αf(αn)+(1−α)f((1−α)n)=T(α),0≤α≤1
即给定一个规模为 n n n的问题,其平均复杂度可以表征成为一个关于 α \alpha α的函数。对于这个函数,显然有 T ( α ) = T ( 1 − α ) T(\alpha) = T(1-\alpha) T(α)=T(1−α),即该函数是关于 α = 1 2 \alpha=\frac{1}{2} α=21对称的。那么问题来了,这个函数为什么在 α = 1 2 \alpha=\frac{1}{2} α=21时取得全局最小值呢?
这里为了容易理解我们首先讨论另外一个更简单的函数:
t
1
(
α
)
=
α
f
(
α
n
)
t_1(\alpha) = \alpha f(\alpha n)
t1(α)=αf(αn),这里面需要注意一下的是这个
n
n
n在这里是一个常数。问题的关键就在于这个
t
1
(
α
)
t_1(\alpha)
t1(α)的凹凸性。有关于函数的凹凸性有很多等价的定义,这里需要注意一下,很多教材或者wiki上对凹函数和凸函数的定义都不同,有的管上弯的叫凹函数有的叫凸函数,其实具体叫什么并无所谓,po一张网上捞来的图并以此为下文的凹凸函数定义。

对于
t
1
(
α
)
=
α
f
(
α
n
)
t_1(\alpha) = \alpha f(\alpha n)
t1(α)=αf(αn),其中
n
n
n为常数。显然
t
2
(
α
)
=
t
1
(
1
−
α
)
=
(
1
−
α
)
f
(
(
1
−
α
)
n
)
t_2(\alpha)=t_1(1-\alpha) = (1-\alpha) f((1-\alpha) n)
t2(α)=t1(1−α)=(1−α)f((1−α)n),即
t
1
(
α
)
t_1(\alpha)
t1(α)与
t
1
(
α
)
t_1(\alpha)
t1(α)是关于
α
=
1
2
\alpha=\frac{1}{2}
α=21对称的,即这两个函数的凹凸性相同。
T
(
α
)
=
t
1
(
α
)
+
t
2
(
α
)
T(\alpha) = t_1(\alpha)+t_2(\alpha)
T(α)=t1(α)+t2(α),两个凹函数的和仍然是凹函数,两个凸函数的和仍然是凸函数,所以
T
(
α
)
T(\alpha)
T(α)的凹凸性也与
t
1
(
α
)
=
α
f
(
α
n
)
t_1(\alpha) = \alpha f(\alpha n)
t1(α)=αf(αn)的凹凸性相同。
至此,我们得到了两个非常重要的结论:
1.
f
(
n
)
‾
=
T
(
α
)
\overline{f(n)} = T(\alpha)
f(n)=T(α)是关于
α
=
1
2
\alpha=\frac{1}{2}
α=21对称的。
2.
f
(
n
)
‾
=
T
(
α
)
\overline{f(n)} = T(\alpha)
f(n)=T(α)的凹凸性与
t
1
(
α
)
=
α
f
(
α
n
)
t_1(\alpha) = \alpha f(\alpha n)
t1(α)=αf(αn)相同。
那么如果
f
(
n
)
‾
=
T
(
α
)
\overline{f(n)} = T(\alpha)
f(n)=T(α)分别是凸函数(1)、凹函数(3)、非凹非凸(常函数)(2),他们的图像分别是什么样呢?如下所示,再加上对称性的条件,很容易得到(用凹凸函数的定义写一下不等式就行了):在凸函数情况下,
α
=
1
2
\alpha=\frac{1}{2}
α=21取最大值;凹函数下
α
=
1
2
\alpha=\frac{1}{2}
α=21取最小值;非凹非凸函数随意,任何值处的结果都相同。

那么
T
(
α
)
T(\alpha)
T(α)或者说
t
1
(
α
)
=
α
f
(
α
n
)
t_1(\alpha)= \alpha f(\alpha n)
t1(α)=αf(αn)在什么时候是凹函数,什么时候是凸函数呢?对于一个规模为
n
n
n的问题,其复杂度只能是:常数、
l
o
g
(
n
)
log(n)
log(n)或
n
m
(
m
>
0
)
n^m(m>0)
nm(m>0),当:
- 复杂度为常数时,即 f ( α n ) = c f(\alpha n)=c f(αn)=c, t 1 ( α ) = α f ( α n ) t_1(\alpha)= \alpha f(\alpha n) t1(α)=αf(αn),则 T ( α ) = t 1 ( α ) + t 2 ( α ) = c + c = 2 c = c o n s t a n t T(\alpha) = t_1(\alpha)+t_2(\alpha)=c+c=2c=constant T(α)=t1(α)+t2(α)=c+c=2c=constant,对应于上图的2情况。
- 复杂度为 l o g ( n ) log(n) log(n)或 n m ( m > 0 ) n^m(m>0) nm(m>0)时, t 1 ( α ) = α f ( α n ) t_1(\alpha)= \alpha f(\alpha n) t1(α)=αf(αn)为凹函数(求导很容易得到二阶导数大于0),对应上图3的情况,此时在 α = 1 2 \alpha=\frac{1}{2} α=21处取得最小期望复杂度。
- 截至目前我还没有碰到过复杂度随问题规模单调递减的问题,最起码也得是个常数复杂度吧,所以基本可以认为这种情况在以实际问题为背景的情况下是不存在的。
而我们实际遇到的问题中,绝大多数算法或数据结构问题都属于以上的第二种种情况(毕竟复杂度和问题规模无关的问题我们几乎不会单独去讨论),所以这种前提被默认满足了,因此五五对分是合理的选择。
620

被折叠的 条评论
为什么被折叠?



