INF421 - Amphi 2 Divide and Conquer
0.Quizz回顾
在数组中同时寻找最大和最小元素
- 将n个元素两两分为一组,一组有两个元素,一共有 n 2 \frac{n}{2} 2n组
- 将每组中的元素按从小到达排序。 ⌊ n 2 ⌋ \left \lfloor \frac{n}{2} \right \rfloor ⌊2n⌋次比较。
- 在最小的元素中寻找最小的元素, ⌈ n 2 ⌉ − 1 \left \lceil \frac{n}{2} \right \rceil-1 ⌈2n⌉−1次比较
- 在最大的元素中寻找最小的元素,
⌈
n
2
⌉
−
1
\left \lceil \frac{n}{2} \right \rceil-1
⌈2n⌉−1次比较。
所以一共要 ⌈ 3 ∗ n 2 ⌉ − 2 \left \lceil 3*\frac{n}{2} \right \rceil-2 ⌈3∗2n⌉−2次比较。
Big-Oh Notation (Landau Symbols)
定义:
f,g real function
f
=
O
(
g
)
f=O(g)
f=O(g)意味着
∃
M
,
x
0
∈
R
使得
∣
f
(
x
)
∣
≤
M
∣
g
(
x
)
∣
∀
x
≥
x
0
\exists M,x_0 \in \mathbb{R} \text{ 使得 } |f(x)|\leq M|g(x)| \forall x \geq x_0
∃M,x0∈R 使得 ∣f(x)∣≤M∣g(x)∣∀x≥x0
注意:
- = = =不是symmetric的,因为 2 n = O ( n ) , 3 n = O ( n ) 2n=O(n),3n=O(n) 2n=O(n),3n=O(n)不能推出 2 n = 3 n 2n=3n 2n=3n。
其他的:
f
=
Ω
(
g
)
:
=
⇔
g
=
O
(
f
)
f = \Omega(g) :=\Leftrightarrow g = O(f)
f=Ω(g):=⇔g=O(f)
f
=
Θ
(
g
)
:
=
⇔
f
=
O
(
g
)
∧
f
=
Ω
(
g
)
f = \Theta(g) :=\Leftrightarrow f = O(g) \wedge f=\Omega(g)
f=Θ(g):=⇔f=O(g)∧f=Ω(g)
f
=
o
(
g
)
:
=
⇔
∀
ϵ
>
0
∃
x
0
∈
R
∀
x
≥
x
0
:
∣
f
(
x
)
∣
≤
ϵ
∗
∣
g
(
x
)
∣
f = o(g) :=\Leftrightarrow \forall \epsilon > 0 \exists x_0 \in \mathbb{R} \forall x \geq x_0: |f(x)| \leq \epsilon*|g(x)|
f=o(g):=⇔∀ϵ>0∃x0∈R∀x≥x0:∣f(x)∣≤ϵ∗∣g(x)∣
f
=
w
(
g
)
:
=
⇔
g
=
o
(
f
)
f = w(g) :=\Leftrightarrow g = o(f)
f=w(g):=⇔g=o(f)
1. Introduction to Divide and Conquer
基本思路:
- 将对于n的问题变成independent的n/2问题
- solve n/2的问题(recursively)
- merge两个n/2的结果
Mergesort
目的:对a[0…n]进行排序
Sol:
- if(n==1) return a
- split b : = a [ 0 , … , ⌈ n 2 ⌉ − 1 ] b:=a[0,\dots,\left \lceil \frac{n}{2} \right \rceil -1] b:=a[0,…,⌈2n⌉−1], c : = a [ ⌈ n 2 ⌉ , … , n − 1 ] c:=a[\left \lceil \frac{n}{2} \right \rceil,\dots,n-1] c:=a[⌈2n⌉,…,n−1]
- Recursion: Mergesort(b),Mergesort(a)
- Merge(可以用Recursive的方式实现)
Analysis of MergeSort (对Recursive algs的分析)
Termination:[Induction]
- 用第二数学归纳法假设对 ∀ k < n \forall k<n ∀k<n的数组用Mergesort都Terminate。
- 则Mergesort(a[n])调用的 a [ 0 , … , ⌈ n 2 ⌉ − 1 , a [ ⌈ n 2 ⌉ , … , n − 1 ] a[0,\dots,\left \lceil \frac{n}{2} \right \rceil -1, a[\left \lceil \frac{n}{2} \right \rceil,\dots,n-1] a[0,…,⌈2n⌉−1,a[⌈2n⌉,…,n−1] Terminates
- 最后的Merge Terminates,因为我们用Recursive的方法写,每次都会减少一个元素。
Correctness:[Induction]
- 用第二数学归纳法假设对 ∀ k < n \forall k<n ∀k<n的数组用Mergesort都Corrcet。
- 则Mergesort(a[n])调用的 a [ 0 , … , ⌈ n 2 ⌉ − 1 , a [ ⌈ n 2 ⌉ , … , n − 1 ] a[0,\dots,\left \lceil \frac{n}{2} \right \rceil -1, a[\left \lceil \frac{n}{2} \right \rceil,\dots,n-1] a[0,…,⌈2n⌉−1,a[⌈2n⌉,…,n−1] Corrcet.
- 最后的Merge根据我们的做法可以保证顺序,所以Correct
Complexity: [看递推式]
看比较次数,这里的
≥
\geq
≥是因为我们在merge的过程中,最坏的情况是比较n-1次。
T
(
n
)
≤
T
(
⌈
n
2
⌉
)
+
T
(
⌊
n
2
⌋
)
+
n
−
1
T(n) \leq T(\left \lceil \frac{n}{2} \right \rceil ) + T(\left \lfloor \frac{n}{2} \right \rfloor ) + n -1
T(n)≤T(⌈2n⌉)+T(⌊2n⌋)+n−1
T
(
1
)
=
0
T(1)=0
T(1)=0
求解Reccurence 的方法1:Guess & Check
-
Guess
T ( n ) ≤ 2 ∗ T ( n 2 ) + n ≤ n ∗ T ( 1 ) + l o g 2 ( n ) ∗ n \begin{aligned} T(n) &\leq 2*T(\frac{n}{2})+n\\ &\leq n*T(1)+log_2(n)*n\\ \end{aligned} T(n)≤2∗T(2n)+n≤n∗T(1)+log2(n)∗n -
Check
根据上面的式子,我们猜测 T ( n ) ≤ U ( n ) : = n ⌈ l o g 2 ( n ) ⌉ T(n) \leq U(n):=n\left \lceil log_2(n) \right \rceil T(n)≤U(n):=n⌈log2(n)⌉(因为 l o g 2 ( n ) log_2(n) log2(n)不行)
下用数学归纳法给出证明
- n = 1 n=1 n=1时, T ( 1 ) = 0 T(1)=0 T(1)=0,所以成立。
- 假设猜测对于任意 k < n k < n k<n都成立
- 此时
T ( n ) ≤ T ( ⌈ n 2 ⌉ ) + T ( ⌊ n 2 ⌋ ) + n ≤ ⌈ n 2 ⌉ ⌈ l o g 2 ⌈ n 2 ⌉ ⌉ + ⌊ n 2 ⌋ ⌈ l o g 2 ( ⌊ n 2 ⌋ ) ⌉ + n ≤ n + n ⌈ l o g 2 ( n / 2 ) ⌉ ≤ n ⌈ l o g 2 ( n ) ⌉ \begin{aligned} T(n) &\leq T(\left \lceil \frac{n}{2} \right \rceil ) + T(\left \lfloor \frac{n}{2} \right \rfloor ) + n \\ &\leq \left \lceil \frac{n}{2} \right \rceil \left \lceil log_2{\left \lceil \frac{n}{2} \right \rceil} \right \rceil + \left \lfloor \frac{n}{2} \right \rfloor \left \lceil log_2(\left \lfloor \frac{n}{2} \right \rfloor) \right \rceil +n \\ &\leq n+ n \left \lceil log_2(n/2) \right \rceil\\ &\leq n \left \lceil log_2(n) \right \rceil\\ \end{aligned} T(n)≤T(⌈2n⌉)+T(⌊2n⌋)+n≤⌈2n⌉⌈log2⌈2n⌉⌉+⌊2n⌋⌈log2(⌊2n⌋)⌉+n≤n+n⌈log2(n/2)⌉≤n⌈log2(n)⌉
用到了
⌈
l
o
g
2
⌈
n
2
⌉
⌉
=
⌈
l
o
g
2
n
2
⌉
\left \lceil log_2{\left \lceil \frac{n}{2} \right \rceil} \right \rceil = \left \lceil log_2{ \frac{n}{2}} \right \rceil
⌈log2⌈2n⌉⌉=⌈log22n⌉ 🌟
2. 🌟Master Theorem
我们将一个大小为n的问题分为a个大小为
n
b
\frac{n}{b}
bn的子问题。
具体来说,
- a ∈ N ≥ 1 , K ∈ N ≥ 1 , b ∈ R > 1 , d ∈ R > 0 a \in \mathbb{N}_{\geq 1},K \in \mathbb{N}_{\geq 1}, b \in \mathbb{R}_{>1}, d \in \mathbb{R}_{>0} a∈N≥1,K∈N≥1,b∈R>1,d∈R>0
- Base case:解决一个size为1的case所需要的时间为K
- Recursion:
- 我们递归解决 a a a个子问题
- 每个子问题的大小为 n b \frac{n}{b} bn
- 将解合并在一起需要的复杂度为 Θ ( n d ) \Theta(n^d) Θ(nd)
例如,对于MergeSort而言,我们每次分成 a = 2 a=2 a=2个大小为 n 2 \frac{n}{2} 2n即 b = 2 b=2 b=2的子问题,base case的复杂度为 K = 0 K=0 K=0,Merge的复杂度为 Θ ( n ) \Theta(n) Θ(n)。
Recursion Tree
🌟 用上了
l
o
g
b
(
n
)
l
o
g
n
(
a
)
=
l
o
g
b
(
a
)
log_b(n) log_n(a) = log_b(a)
logb(n)logn(a)=logb(a),所以有
a
l
=
a
l
o
g
b
(
n
)
=
n
l
o
g
b
(
a
)
=
n
c
a^l=a^{log_b(n)}=n^{log_b(a)}=n^c
al=alogb(n)=nlogb(a)=nc
[回顾] 等比数列
这里我们关心的是asymptotique的结果
- q > 1 : ∑ i = 0 k − 1 q i = Θ ( q k − 1 ) q > 1 : \sum_{i=0}^{k-1} q^i = \Theta(q^{k-1}) q>1:∑i=0k−1qi=Θ(qk−1)
- q = 1 : ∑ i = 0 k − 1 q i = k q = 1 : \sum_{i=0}^{k-1} q^i = k q=1:∑i=0k−1qi=k
- q < 1 : ∑ i = 0 k − 1 q i = Θ ( q 0 ) = Θ ( 1 ) q < 1 : \sum_{i=0}^{k-1} q^i = \Theta(q^0)=\Theta(1) q<1:∑i=0k−1qi=Θ(q0)=Θ(1)
回到我们的Recursion Tree
Rq:
- 以上分析对于n不是b的次数也成立
- 以上分析对于Stop the recursion earlier than at problem size 1也成立
Master Theorem❓
3. 例子:大数乘法与Karatsuba’s Trick
我们目前已经证明了Divide and Conquer原则上怎么可以运作,但是我们并不知道怎么设计一个Divide and Conquer的算法,为此,我们研究三个问题:
- Fast Multiplication of Large Numbers
- 这个问题的难点在于如何在子问题做到比Naive更好
- Closet pair of points
- 这个问题的难点是如何构建Recursion,即如何merge两个不同的解
- Selection
3.1 Multiplying Large Numbers
问题:
- x = ( x n − 1 x n − 2 … x 0 ) B = ∑ i = 0 n − 1 x i B i x=(x_{n-1}x_{n-2}\dots x_0)_B = \sum_{i=0}^{n-1}x_iB^i x=(xn−1xn−2…x0)B=∑i=0n−1xiBi
- y = ( y n − 1 y n − 2 … y 0 ) B = ∑ i = 0 n − 1 y i B i y=(y_{n-1}y_{n-2}\dots y_0)_B = \sum_{i=0}^{n-1}y_iB^i y=(yn−1yn−2…y0)B=∑i=0n−1yiBi
- 求x*y
Naive Solution: Θ ( n 2 ) \Theta(n^2) Θ(n2)
-
因为 x y = ∑ i = 0 n − 1 ∑ j = 0 n − 1 x i y j B i + j xy=\sum_{i=0}^{n-1}\sum_{j=0}^{n-1}x_iy_jB^{i+j} xy=∑i=0n−1∑j=0n−1xiyjBi+j
-
Naive Divide and Conquer: Θ ( n 2 ) \Theta(n^2) Θ(n2)
-
Divide
假设n是偶数,令 m = n / 2 m=n/2 m=n/2
x = x b B m + x a x=x_bB^m+x_a x=xbBm+xa, x b = ( x n − 1 x n − 2 … x m ) B , x a = ( x m − 1 x n − 2 … x 0 ) B x_b=(x_{n-1}x_{n-2}\dots x_m)_B,x_a=(x_{m-1}x_{n-2}\dots x_0)_B xb=(xn−1xn−2…xm)B,xa=(xm−1xn−2…x0)B
y = y b B m + y a y=y_bB^m+y_a y=ybBm+ya, y b = ( y n − 1 y n − 2 … y m ) B , y a = ( y m − 1 y n − 2 … y 0 ) B y_b=(y_{n-1}y_{n-2}\dots y_m)_B,y_a=(y_{m-1}y_{n-2}\dots y_0)_B yb=(yn−1yn−2…ym)B,ya=(ym−1yn−2…y0)B -
Recurse
运用递归计算 x b y b , x a y b , x b y a , x a y a x_by_b,x_ay_b,x_by_a,x_ay_a xbyb,xayb,xbya,xaya这四个大数的乘法
所以 a = 4 , b = 2 a=4,b=2 a=4,b=2 -
Merge
x y = x b y b B 2 m + ( x a y b + x b y a ) B m + x a y a xy = x_by_bB^{2m}+(x_ay_b+x_by_a)B^m+x_ay_a xy=xbybB2m+(xayb+xbya)Bm+xaya -
分析
运用Master Theorem知 a = 4 , b = 2 , d = 1 a=4,b=2,d=1 a=4,b=2,d=1,因为 a b d > 1 \frac{a}{b^d}>1 bda>1,所以复杂度为 O ( n c ) = O ( n l o g b ( a ) ) = O ( n 2 ) O(n^c)=O(n^{log_b(a)})=O(n^2) O(nc)=O(nlogb(a))=O(n2)
Karatsuba: Θ ( n l o g 2 ( 3 ) ) \Theta(n^{log_2(3)}) Θ(nlog2(3))
- Divide
假设n是偶数,令 m = n / 2 m=n/2 m=n/2
x = x b B m + x a x=x_bB^m+x_a x=xbBm+xa, x b = ( x n − 1 x n − 2 … x m ) B , x a = ( x m − 1 x n − 2 … x 0 ) B x_b=(x_{n-1}x_{n-2}\dots x_m)_B,x_a=(x_{m-1}x_{n-2}\dots x_0)_B xb=(xn−1xn−2…xm)B,xa=(xm−1xn−2…x0)B
y = y b B m + y a y=y_bB^m+y_a y=ybBm+ya, y b = ( y n − 1 y n − 2 … y m ) B , y a = ( y m − 1 y n − 2 … y 0 ) B y_b=(y_{n-1}y_{n-2}\dots y_m)_B,y_a=(y_{m-1}y_{n-2}\dots y_0)_B yb=(yn−1yn−2…ym)B,ya=(ym−1yn−2…y0)B - Recurse:
计算 x b y b , x a y a , ( x a + x b ) ( y a + y b ) x_by_b,x_ay_a,(x_a+x_b)(y_a+y_b) xbyb,xaya,(xa+xb)(ya+yb) - Merge
x y = x b y b B 2 m + ( ( x a + x b ) ( y a + y b ) − x b y b − x a y b ) B m + x a y a xy = x_by_bB^{2m}+((x_a+x_b)(y_a+y_b)-x_by_b-x_ay_b)B^m+x_ay_a xy=xbybB2m+((xa+xb)(ya+yb)−xbyb−xayb)Bm+xaya - 分析
运用Master Theorem知 a = 3 , b = 2 , d = 1 a=3,b=2,d=1 a=3,b=2,d=1,因为 a b d > 1 \frac{a}{b^d}>1 bda>1,所以复杂度为 O ( n c ) = O ( n l o g b ( a ) ) = O ( n l o g 2 ( 3 ) ) O(n^c)=O(n^{log_b(a)})=O(n^{log_2(3)}) O(nc)=O(nlogb(a))=O(nlog2(3))
3.2 Closet pair of points O(nlogn) [Poly]
问题描述:
在一个平面上给定
n
n
n个点
p
i
=
(
x
i
,
y
i
)
p_i=(x_i,y_i)
pi=(xi,yi),目的是找到两个点
p
i
,
p
j
p_i,p_j
pi,pj它们两个之间的欧几里得距离最短。
解法1:暴力配对
此时时间复杂度为 O ( n 2 ) O(n^2) O(n2)
3.3 Computing the Median[Selection Problem]
定义:
- 第k小的元素:
一个元素a[i]被称为第k小的元素,如果存在 J ⊆ [ n ] : = { 1 , 2 , … , n } J\subseteq [n]:=\{1,2,\dots,n\} J⊆[n]:={1,2,…,n}使得
∣ J ∣ = k − 1 ∀ j ∈ J : a [ j ] ≤ a [ i ] ∀ j ∈ [ n ] ∖ ( J ∪ { i } ) : a [ j ] ≥ a [ i ] \begin{aligned} |J| & = k-1 \\ \forall j \in J &: a[j] \leq a[i] \\ \forall j \in [n]\setminus(J\cup \{i\}) &: a[j] \geq a[i] \\ \end{aligned} ∣J∣∀j∈J∀j∈[n]∖(J∪{i})=k−1:a[j]≤a[i]:a[j]≥a[i] - rank:如果a中都是distinct的元素,则每一个元素 a [ i ] a[i] a[i]都对应一个k,意味着它是第k小的元素,则k被称为它的rank。
Selection 问题表述:
求一个数组a中的第k小的元素。
特别的,如果数组下标从1开始,则
k
=
⌈
n
2
⌉
k=\left \lceil \frac{n}{2} \right \rceil
k=⌈2n⌉对应着求中位数的问题。[对于偶数,有时候我们定义中间两数字的平均值为median]
解法1:Selection via Sorting
Selection via Sorting: Θ ( n l o g n ) \Theta(nlogn) Θ(nlogn)
Rq:
- 在要多次求不同k小的元素的问题中,这个方法刚好
- 但是当n比较大,如果没有 l o g ( n ) log(n) log(n)会更好。
解法2:Naive Divide and Conquer
Divide and Conquer:
- Divide:
将a分成b和c两个部分,b中所有的元素都小于等于c中所有元素。
我们可以用pivot a[p]来实现:左边的b全部严格小于a[p],中间的元素等于a[p],右边的元素严格大于a[p]。 - Recurse:
- 如果b中有大于等于k个元素,则在b中寻找第k大的元素。
Select(b,k)
[下面的伪代码中分出了a[p]恰好为第k小的情况] - 反之,我们在c中寻找第(k-len(b)) 大的元素。
Select(a,k-len(b))
- 如果b中有大于等于k个元素,则在b中寻找第k大的元素。
分析:
对于任意一种选择pivot p的方式
- Select(a,k) terminates
- 最多用O(n^2) comparaisons
- Is correct
Dem:
- Termination:🌟
The recursive call terminates by inuction (对于Select(a,k)中a的长度运用归纳法), the rest terminates trivally - Correctness:
By induction - Runtime:
T ( n ) ≤ n − 1 + T ( n − 1 ) , T ( 1 ) = 0 T(n)\leq n-1+T(n-1),T(1)=0 T(n)≤n−1+T(n−1),T(1)=0我们可以用Guess&Check证明 U ( n ) = 0 + 1 + ⋯ + ( n − 1 ) = O ( n 2 ) U(n)=0+1+\dots+(n-1)=O(n^2) U(n)=0+1+⋯+(n−1)=O(n2)是 T ( n ) T(n) T(n)的一个Upper Bound
因此我们需要一种更好地找到pivot P的方法,一种最好的想法就是找到最中间的元素,但可惜我们的目的就是求Median。
Sol: Median-of-Medians
Median-of-Medians:更好的pivot
基本想法:
- 将a,5个一组,分成 ⌊ n 5 ⌋ \left \lfloor \frac{n}{5} \right \rfloor ⌊5n⌋组。
- 每组中花 K = 6 K=6 K=6次比较找到每组中的中位数
- 通过递归找到这 ⌊ n 5 ⌋ \left \lfloor \frac{n}{5} \right \rfloor ⌊5n⌋个中位数中的中位数(Median of these medians, MoM)并用它作为pivot。
示例(这里我们为了方便演示每列大小顺序都拍好了,横向也排好了,红色的是中位数,5*20)
关于MoM的rank k的Lemma:
The MoM has a rank k with 0.3 n − 1.2 ≤ k ≤ 0.7 n − 0.3 0.3n-1.2\leq k \leq 0.7n-0.3 0.3n−1.2≤k≤0.7n−0.3
这里我们可以发现k已经很靠中间了。
构造运用MoM的Selection Algo的复杂度递推式
求解递推式
这里T(n)应该代表从n个元素中找到中位数的开销,
n
−
1
n-1
n−1是因为我们要根据pivot得到b和c。
结果:
The MoM algorithm solves the selection problem with O(n) comparisons.
一些改进和Stronger Bounds
首先我们可以对我们的方法进行更细致的分析
- 如K=6
- T ( n ) ≤ T ( 0.2 n ) + T ( 0.7 n ) + 2.2 n T(n)\leq T(0.2n)+T(0.7n)+2.2n T(n)≤T(0.2n)+T(0.7n)+2.2n,因此 T ( n ) ≤ 22 n T(n)\leq22n T(n)≤22n (见Poly)
- 因此当 22 ≤ l o g 2 ( n ) 22 \leq log_2(n) 22≤log2(n)即 n ≥ 2 22 n\geq 2^{22} n≥222时,MoM比sorting更好。
其他人的工作:
4. Lower Bounds
目的:
证明没有一个Algorithm能在worst case下有一个比 Ω ( . . . ) \Omega(...) Ω(...)更好的表现。
这个问题至少需要多少的复杂度才能解决
3 ways to show bounds
“Reading the Input” Lower Bound
每一个算法都至少需要读入数据。
例子:两个n*n的矩阵乘法 Ω ( n 2 ) \Omega(n^2) Ω(n2)
证明Selection Problem的Lower Bound为
Ω
(
n
)
\Omega(n)
Ω(n)
🌟这类的证明思路基本是
- 假设一个算法可以用少于N次就可以完成任务,因此可以找到一个元素 a [ i ] a[i] a[i]没有在这个算法中读取
- 通过对 a [ i ] a[i] a[i]进行改变得到两个不同的问题(它们答案也不同),鉴于算法只读取了n-1个元素的数据,所以这个算法对两个不同问题都有相同的答案 -> Absurde
Information-theoretic Lower Bound
如果一个问题有N个possible solutions,算法的每一步最多有k个结果(信息),则 l o g k N log_kN logkN是lower bound。[可以用树来思考]
例子:Sorting an array of length n via comparaison-based algorithms:
- 长度为n的array一共有n!种排列方式
- 每一种排列方式只有2种结果
- 所以要知道所有的可能性,需要用 l o g 2 n ! ≥ n l o g 2 ( n ) − n l o g 2 ( e ) + 0.5 l o g 2 ( 2 ∗ π ∗ n ) log_2n! \geq nlog_2(n)-nlog_2(e)+0.5log_2(2*\pi*n) log2n!≥nlog2(n)−nlog2(e)+0.5log2(2∗π∗n)
- 最后一步用上了🌟斯特林公式:
n
!
≈
2
π
n
(
n
e
)
n
.
n! \approx \sqrt{2\pi n}\, \left(\frac{n}{e}\right)^{n}.
n!≈2πn(en)n.
Rq:
这个Lower Bound并不是很紧,因为对于13个元素,我们需要34次比较,但是 ⌈ l o g 2 ( 13 ) ⌉ = 13 \left \lceil log_2(13) \right \rceil = 13 ⌈log2(13)⌉=13
Lower Bound for Sorting 正式证明:
依旧延续之前的思路,
假设可以比这个Lower Bound少一次,则可以找到两个不同的输入使得他们经过这个算法最后得到的结果是相同的,矛盾。
Custom-Tailored Lower Bounds
这里我们需要结合具体问题的性质。
例子:Merge操作
- Reading the input argument:鉴于我们需要读取所有的数据,所以O(2n)
- Information-theoretic argument:
- ( 2 n n ) = Θ ( 2 2 n n − 1 / 2 ) \binom{2n}{n}=\Theta(2^{2n}n^{-1/2}) (n2n)=Θ(22nn−1/2)
- 2 results per comparaison (如果比较的两个元素不同的话)
- 最少需要 l o g 2 ( ( 2 n n ) ) = 2 n − 0.5 ∗ l o g 2 ( n ) − O ( 1 ) log_2(\binom{2n}{n})=2n-0.5*log_2(n)-O(1) log2((n2n))=2n−0.5∗log2(n)−O(1)次比较
证明:
依旧使用反证法,假设我们的算法还可以再快一点,然后修改某一个没有被看到的数据,两个不同输入->同样的输出->导致矛盾。
Hot Topic: Conditional Lower Bounds
例子 Longest Common Subsequence [我们只有Conditional Lower Bounds]
如,如果我们可以用
O
(
n
2
−
ϵ
)
O(n^{2-\epsilon})
O(n2−ϵ)解决LCS问题,则我们可以用
O
(
2
(
1
−
ϵ
)
n
)
O(2^{(1-\epsilon)n})
O(2(1−ϵ)n)的时间解决这个问题。