前言
- 大多都为自己的闲暇思考。
可能会有错误的或者表述不正确的地方,见谅。
- 符号说明
下述例子,
T
(
n
)
T(n)
T(n) 表示数据规模为
n
n
n 的时间复杂度
O
(
n
)
O(n)
O(n) 表示大
O
O
O 计数法,即最坏复杂度 下述例子默认边界条件
T
(
1
)
=
O
(
1
)
T(1)=O(1)
T(1)=O(1) 题目都为求解
T
(
n
)
T(n)
T(n) 的非递推公式。
题目
- 计算
T
(
n
)
=
F
(
n
)
+
a
T
(
n
b
)
T(n)=F(n)+aT(\frac{n}{b})
T(n)=F(n)+aT(bn?) 其中
F
(
n
)
F(n)
F(n) 为一个关于
n
n
n 的简单函数。 这里简单函数:指幂函数、常函数,或上述函数的简单加减(多项式函数)。 我们通常使用
P
(
x
)
P(x)
P(x) 表示(虽然下文中都使用了
F
(
x
)
F(x)
F(x)) - (更新)注:
指数函数和对数函数在这里不能使用本文提到的做法来做,原因在思考二中。
思考一
- 求
T
(
n
)
=
2
T
(
n
/
2
)
T(n)=2T(n/2)
T(n)=2T(n/2) - 容易得到,是一个等比数列,首项为1,公比为2,递归层数为
?
log
?
2
n
?
+
1
\lfloor \log_2n \rfloor +1
?log2?n?+1 至
T
(
0
)
T(0)
T(0)
即递归次数
?
log
?
2
n
?
\lfloor \log_2n \rfloor
?log2?n? 至
T
(
1
)
T(1)
T(1)
T
(
n
)
=
O
(
2
log
?
2
n
)
=
O
(
n
)
T(n)= O(2^{\log_2 n})=O(n)
T(n)=O(2log2?n)=O(n) 注:由于大
O
O
O 计数法,忽略常数,若数不为2的幂次,应该计算得到为
n
~
2
n
n\sim 2n
n~2n 的一个数。 手模拟也可以得到,
T
(
1
)
=
1
,
T
(
2
)
=
2
,
T
(
4
)
=
4
,
e
t
c
.
T(1)=1,T(2)=2,T(4)=4,etc.
T(1)=1,T(2)=2,T(4)=4,etc.
思考二
- 求
T
(
n
)
=
F
(
n
)
+
2
T
(
n
/
2
)
T(n)=F(n)+2T(n/2)
T(n)=F(n)+2T(n/2) - 首先容易得到,
T
(
n
)
T(n)
T(n) 是不低于
O
(
n
)
O(n)
O(n) 的,因为
F
(
n
)
至
少
O
(
1
)
F(n)至少O(1)
F(n)至少O(1)
我们若只考虑
2
2
2 的幂次 然后,由于每一次
n
→
n
/
2
n\rightarrow n/2
n→n/2 ,我们可以想到,迭代次数为
?
log
?
2
n
?
\lfloor \log_2n \rfloor
?log2?n?,即上述等价于
T
2
(
x
)
=
F
(
2
x
)
+
2
T
2
(
x
?
1
)
T_2(x)=F(2^x)+2T_2(x-1)
T2?(x)=F(2x)+2T2?(x?1) 其中
T
(
n
)
=
T
2
(
?
log
?
2
n
?
)
=
T
2
(
l
o
g
2
n
)
T(n)=T_2(\lfloor \log_2n \rfloor)=T_2(log_2n)
T(n)=T2?(?log2?n?)=T2?(log2?n) 因为我们只考虑
2
2
2 的幂次。 - 由于数据规模越大,
F
(
2
x
)
F(2^x)
F(2x) 是应当越来越大的。
容易看出来,这是一个等比数列变种。我们设:
T
2
(
x
)
+
F
(
2
x
)
c
=
2
(
T
2
(
x
?
1
)
+
F
(
2
x
?
1
)
c
)
其
中
c
是
常
数
(1)
T_2(x)+\frac{F(2^x)}{c} =2(T_2(x-1)+\frac{F(2^{x-1})}{c})\qquad 其中c 是常数\tag{1}
T2?(x)+cF(2x)?=2(T2?(x?1)+cF(2x?1)?)其中c是常数(1) 通过移项,我们可以得到:
2
F
(
2
x
?
1
)
?
F
(
2
x
)
c
=
F
(
2
x
)
\frac{2F(2^{x-1})-F(2^x)}{c}=F(2^x)
c2F(2x?1)?F(2x)?=F(2x) 即
c
=
2
F
(
2
x
?
1
)
?
F
(
2
x
)
F
(
2
x
)
c=\frac{2F(2^{x-1})-F(2^x)}{F(2^x)}
c=F(2x)2F(2x?1)?F(2x)? 我们目前可以做的内容,就是
F
(
n
/
2
)
F
(
2
n
)
=
(
F
(
n
)
)
2
F(n/2)F(2n)=(F(n))^2
F(n/2)F(2n)=(F(n))2 情况下的分析。 这样的话,
c
c
c 就是一个常数。 对于幂函数,注意到,如果
F
(
n
)
=
a
n
b
F(n)=an^b
F(n)=anb 的话是成立的。 由于我们是大
O
O
O 计数,故只记录
F
(
n
)
F(n)
F(n) 的最高次项即可,忽略低次项。 可以看出来,分母大于
1
1
1,分母
2
F
(
2
x
?
1
)
?
F
(
2
x
)
2F(2^{x-1})-F(2^x)
2F(2x?1)?F(2x) 决定了
c
c
c 的符号,或者
c
=
0
c=0
c=0。
若
c
≠
0
c\ne 0
c?=0,我们接下来可得
- 于是,我们由
(
1
)
(1)
(1) 可以得到:
T
2
(
x
)
+
F
(
2
x
)
/
c
T
2
(
x
?
1
)
+
F
(
2
x
?
1
)
/
c
=
2
\frac{T_2(x)+F(2^x)/c}{T_2(x-1)+F(2^{x-1})/c}=2
T2?(x?1)+F(2x?1)/cT2?(x)+F(2x)/c?=2 设
S
(
x
)
=
T
2
(
x
)
+
F
(
2
x
)
/
c
S(x)=T_2(x)+F(2^x)/c
S(x)=T2?(x)+F(2x)/c,边界条件
S
(
1
)
=
T
2
(
1
)
+
F
(
2
)
/
c
=
O
(
1
)
+
F
(
2
)
/
c
=
o
(
1
)
S(1)=T_2(1)+F(2)/c=O(1)+F(2)/c=o(1)
S(1)=T2?(1)+F(2)/c=O(1)+F(2)/c=o(1) 得到:
S
(
x
)
=
S
(
1
)
×
2
x
?
1
S(x)=S(1)\times 2^{x-1}
S(x)=S(1)×2x?1 即我们得到了:
S
(
x
)
=
T
2
(
x
)
+
F
(
2
x
)
/
c
=
2
x
?
1
×
o
(
1
)
T
2
(
x
)
=
2
x
?
1
×
o
(
1
)
?
F
(
2
x
)
/
c
S(x)=T_2(x)+F(2^x)/c=2^{x-1}\times o(1)\\ T_2(x)=2^{x-1}\times o(1)-F(2^x)/c
S(x)=T2?(x)+F(2x)/c=2x?1×o(1)T2?(x)=2x?1×o(1)?F(2x)/c 我们转换为
T
(
n
)
T(n)
T(n),便得到了:
T
(
n
)
=
O
(
n
)
?
F
(
n
)
/
c
(2)
T(n)=O(n)-F(n)/c \tag{2}
T(n)=O(n)?F(n)/c(2) - 我们得到了结论:
若
c
>
0
c >0
c>0,那么
T
(
n
)
=
O
(
n
)
T(n)=O(n)
T(n)=O(n) 若
c
<
0
c<0
c<0,那么
T
(
n
)
=
O
(
n
?
F
(
n
)
/
c
)
=
O
(
n
+
(
F
(
n
)
)
2
F
(
n
)
?
2
F
(
n
/
2
)
)
T(n)=O(n-F(n)/c)=O(n+\cfrac{(F(n))^2}{F(n)-2F(n/2)})
T(n)=O(n?F(n)/c)=O(n+F(n)?2F(n/2)(F(n))2?)
若
c
=
0
c=0
c=0 则是接下来的思考
- 由于
c
=
0
c=0
c=0 ,那么一定有
F
(
2
x
)
=
2
F
(
2
x
?
1
)
=
2
x
?
1
F
(
1
)
F(2^x)=2F(2^{x-1})=2^{x-1}F(1)
F(2x)=2F(2x?1)=2x?1F(1)
那么式子表示成:
T
2
(
x
)
=
2
x
?
1
F
(
2
1
)
+
2
T
2
(
x
?
1
)
=
2
x
+
2
T
2
(
x
?
1
)
T_2(x)=2^{x-1}F(2^1)+2T_2(x-1)=2^x+2T_2(x-1)
T2?(x)=2x?1F(21)+2T2?(x?1)=2x+2T2?(x?1) - 由于我们小学二年级就在 《算法导论》学过这种式子怎么搞,很明显,我们可以看做一个塔,然后瞎搞去算。
- 但是我们之前学过优雅的 特征方程求解非齐次递推线性方程
特征方程为
λ
2
?
2
λ
=
0
\lambda^2-2\lambda =0
λ2?2λ=0 得到
λ
1
=
0
,
λ
=
2
\lambda_1=0,\lambda=2
λ1?=0,λ=2 设递推方程通解为
T
2
(
x
)
=
c
2
x
T_2(x)=c2^x
T2?(x)=c2x 由于非齐次项为
2
x
2^x
2x,为一重根。 设递推方程通解为
T
2
(
x
)
=
c
1
2
x
+
c
2
x
2
x
T_2(x)=c_12^x+c_2x2^x
T2?(x)=c1?2x+c2?x2x 初始项为
T
2
(
0
)
=
0
,
T
2
(
1
)
=
2
T_2(0)=0,T_2(1)=2
T2?(0)=0,T2?(1)=2,得到
T
2
(
x
)
=
x
2
x
T_2(x)=x2^x
T2?(x)=x2x - 即
T
(
n
)
=
T
2
(
log
?
2
n
)
=
O
(
log
?
2
n
×
n
)
=
O
(
n
log
?
2
n
)
T(n)=T_2(\log_2n)=O(\log_2n\times n)=O(n\log_2n)
T(n)=T2?(log2?n)=O(log2?n×n)=O(nlog2?n)
综上
-
c
=
2
F
(
n
/
2
)
?
F
(
n
)
F
(
n
)
c=\frac{2F(n/2)-F(n)}{F(n)}
c=F(n)2F(n/2)?F(n)?
- 若
c
>
0
c >0
c>0,那么
T
(
n
)
=
O
(
n
)
T(n)=O(n)
T(n)=O(n)
若
c
<
0
c<0
c<0,那么
T
(
n
)
=
O
(
n
?
F
(
n
)
/
c
)
=
O
(
n
+
(
F
(
n
)
)
2
F
(
n
)
?
2
F
(
n
/
2
)
)
T(n)=O(n-F(n)/c)=O(n+\cfrac{(F(n))^2}{F(n)-2F(n/2)})
T(n)=O(n?F(n)/c)=O(n+F(n)?2F(n/2)(F(n))2?) 若
c
=
0
c=0
c=0,那么
T
(
n
)
=
O
(
n
log
?
2
n
)
T(n)=O(n\log_2n)
T(n)=O(nlog2?n)
思考三
- 求
T
(
n
)
=
a
T
(
n
/
b
)
T(n)=aT(n/b)
T(n)=aT(n/b) - 思路很简单,就是思考一的延伸。
递归层数为
log
?
b
n
\log_b n
logb?n,每次乘以
a
a
a ,即:
T
(
n
)
=
O
(
a
log
?
b
n
)
=
O
(
a
log
?
a
n
log
?
a
b
)
=
O
(
n
1
log
?
a
b
)
T(n)=O(a^{\log_bn})=O(a^{\cfrac{\log_an}{\log_ab}})=O(n^{\cfrac{1}{\log_ab}})
T(n)=O(alogb?n)=O(aloga?bloga?n?)=O(nloga?b1?)
思考四
- 考虑原题目:
T
(
n
)
=
F
(
n
)
+
a
T
(
n
b
)
T(n)=F(n)+aT(\frac{n}{b})
T(n)=F(n)+aT(bn?) - 其实就是思考二和思考三的拓展版本。
在思考二中,我们利用
T
2
(
x
)
=
T
(
log
?
2
n
)
T_2(x)=T(\log_2n)
T2?(x)=T(log2?n) 在这里,我们利用
T
2
(
x
)
=
T
(
log
?
b
n
)
T_2(x)=T(\log_bn)
T2?(x)=T(logb?n) - 然后构造等比数列:
T
2
(
x
)
+
F
(
b
x
)
c
=
a
(
T
2
(
x
?
1
)
+
F
(
b
x
?
1
)
c
)
其
中
c
是
常
数
T_2(x)+\frac{F(b^x)}{c} =a(T_2(x-1)+\frac{F(b^{x-1})}{c})\qquad 其中c 是常数
T2?(x)+cF(bx)?=a(T2?(x?1)+cF(bx?1)?)其中c是常数 通过移项,我们可以得到:
a
F
(
b
x
?
1
)
?
F
(
b
x
)
c
=
F
(
b
x
)
\frac{aF(b^{x-1})-F(b^x)}{c}=F(b^x)
caF(bx?1)?F(bx)?=F(bx) 即
c
=
a
F
(
b
x
?
1
)
?
F
(
b
x
)
F
(
b
x
)
c=\frac{aF(b^{x-1})-F(b^x)}{F(b^x)}
c=F(bx)aF(bx?1)?F(bx)? 然后继续构造等比数列:
T
2
(
x
)
+
F
(
b
x
)
/
c
T
2
(
x
?
1
)
+
F
(
b
x
?
1
)
/
c
=
a
\frac{T_2(x)+F(b^x)/c}{T_2(x-1)+F(b^{x-1})/c}=a
T2?(x?1)+F(bx?1)/cT2?(x)+F(bx)/c?=a
若
c
≠
0
c\ne 0
c?=0
- 设
S
(
x
)
=
T
2
(
x
)
+
F
(
b
x
)
/
c
S(x)=T_2(x)+F(b^x)/c
S(x)=T2?(x)+F(bx)/c,边界条件
S
(
1
)
=
T
2
(
1
)
+
F
(
b
)
/
c
=
f
(
1
)
S(1)=T_2(1)+F(b)/c=f(1)
S(1)=T2?(1)+F(b)/c=f(1)
我们得到:
S
(
x
)
=
T
2
(
x
)
+
F
(
b
x
)
/
c
=
a
x
?
1
×
f
(
1
)
S(x)=T_2(x)+F(b^x)/c=a^{x-1} \times f(1)
S(x)=T2?(x)+F(bx)/c=ax?1×f(1) 即
T
2
(
x
)
=
a
x
?
1
×
f
(
1
)
?
F
(
b
x
)
/
c
T_2(x)=a^{x-1}\times f(1)-F(b^x)/c
T2?(x)=ax?1×f(1)?F(bx)/c 即
T
(
n
)
=
O
(
a
log
?
b
n
×
f
(
1
)
+
(
F
(
n
)
)
2
F
(
n
)
?
a
F
(
n
/
b
)
)
=
O
(
n
1
log
?
a
b
×
f
(
1
)
+
(
F
(
n
)
)
2
F
(
n
)
?
a
F
(
n
/
b
)
)
\begin{aligned} T(n)&=O\Big( a^{\log_b n} \times f(1)+\frac{(F(n))^2}{F(n)-aF(n/b)}\Big)\\ &=O\Big( n^{\cfrac{1}{\log_ab}}\times f(1)+\frac{(F(n))^2}{F(n)-aF(n/b)}\Big) \end{aligned}
T(n)?=O(alogb?n×f(1)+F(n)?aF(n/b)(F(n))2?)=O(nloga?b1?×f(1)+F(n)?aF(n/b)(F(n))2?)?
若
c
=
0
c=0
c=0
- 即
a
F
(
b
x
?
1
)
=
F
(
b
x
)
aF(b^{x-1})=F(b^x)
aF(bx?1)=F(bx),即
F
(
b
x
)
=
a
x
F
(
1
)
F(b^x)=a^{x}F(1)
F(bx)=axF(1),我们得到:
T
2
(
x
)
=
a
x
F
(
1
)
+
a
T
2
(
x
?
1
)
T_2(x)=a^xF(1)+aT_2(x-1)
T2?(x)=axF(1)+aT2?(x?1) 特征方程为
λ
2
?
a
λ
=
0
\lambda^2-a\lambda=0
λ2?aλ=0,特征根为
λ
1
=
0
,
λ
2
=
a
\lambda_1=0,\lambda_2=a
λ1?=0,λ2?=a 设特征方程为
T
2
(
x
)
=
c
1
a
x
+
c
2
x
a
x
T_2(x)=c_1a^x+c_2xa^x
T2?(x)=c1?ax+c2?xax,带入特解
T
2
(
0
)
=
0
,
T
2
(
1
)
=
a
F
(
1
)
T_2(0)=0,T_2(1)=aF(1)
T2?(0)=0,T2?(1)=aF(1) 得到:
c
1
=
0
,
c
2
=
F
(
1
)
c_1=0,c_2=F(1)
c1?=0,c2?=F(1) - 所以:
T
2
(
x
)
=
F
(
1
)
a
x
x
T_2(x)=F(1)a^xx
T2?(x)=F(1)axx 即:
T
(
n
)
=
O
(
F
(
1
)
a
l
o
g
b
n
log
?
b
n
)
=
O
(
F
(
1
)
n
1
log
?
a
b
log
?
b
n
)
T(n)=O(F(1)a^{log_bn}\log_bn)=O(F(1)n^{\frac{1}{\log_ab}}\log_bn)
T(n)=O(F(1)alogb?nlogb?n)=O(F(1)nloga?b1?logb?n)
综上
- 首先要求
F
(
n
)
F(n)
F(n) 是多项式函数。这样就有常数
c
c
c:
c
=
a
F
(
n
/
b
)
?
F
(
n
)
F
(
n
)
c=\frac{aF(n/b)-F(n)}{F(n)}
c=F(n)aF(n/b)?F(n)? - 若
c
≠
0
c\ne 0
c?=0,则
T
(
n
)
=
O
(
n
1
log
?
a
b
×
(
O
(
1
)
+
F
(
b
)
/
c
)
+
(
F
(
n
)
)
2
F
(
n
)
?
a
F
(
n
/
b
)
)
\begin{aligned} T(n)&=O\Big( n^{\cfrac{1}{\log_ab}}\times (O(1)+F(b)/c)+\frac{(F(n))^2}{F(n)-aF(n/b)}\Big) \end{aligned}
T(n)?=O(nloga?b1?×(O(1)+F(b)/c)+F(n)?aF(n/b)(F(n))2?)? 若
c
=
0
c=0
c=0,则
T
(
n
)
=
O
(
F
(
1
)
n
1
log
?
a
b
log
?
b
n
)
T(n)=O(F(1)n^{\frac{1}{\log_ab}}\log_bn)
T(n)=O(F(1)nloga?b1?logb?n)
参考算法
- 分治复杂度:
T
(
n
)
=
O
(
n
)
+
2
T
(
n
/
2
)
=
O
(
n
log
?
n
)
T(n)=O(n)+2T(n/2)=O(n\log n)
T(n)=O(n)+2T(n/2)=O(nlogn)
- 求第K大元素:
T
(
n
)
=
2
T
(
n
/
2
)
=
O
(
n
)
T(n)=2T(n/2)=O(n)
T(n)=2T(n/2)=O(n)
参考书籍
|