分治算法
算法基本思想
一般而言,被分解的子问题应与原问题具有相同的类型,这样便于算法实现(多数情况下,采用递归算法)
分治算法流程:
DiCo(p,q)
global n,A[1..n];
integer m,p,q;
if Small(p,q) then return(Sol(p,q));
else m:=Divide(p,q);
return(Combine(DiCo(p,m),DiCo(m+1,q)));
end{if}
end{DiCo}
T
(
n
)
=
{
S
o
l
(
n
)
if n is small
2
T
(
n
/
2
)
+
f
(
n
)
f(n) is the time of Combine
T(n)=\begin{cases} Sol(n)& \text{if n is small}\\ 2T(n/2)+f(n)& \text{f(n) is the time of Combine} \end{cases}
T(n)={Sol(n)2T(n/2)+f(n)if n is smallf(n) is the time of Combine
求n元数组中的最大最小元素:
最简单的方法:
直接比较算法:
时间复杂度:最坏:2(n-1) , 最好:2(n-1) , 平均:2(n-1)
递归:
MaxMin(i,j,fmax,fmin)
global n,A[1..n];
integer i,j;
if i=j then
fmax:=A[i];fmin:=A[i];
elif i=j-1 then
if A[i] < A[j] then
fmin:=A[j];fmax=A[i];
else fmin:=A[j];fmax:=A[i];
end{if}
else
mid:=(i+1)/2;
MaxMin(i,mid,lmax,rmin);
MaxMin(mid+1,j,rmax,rmin);
fmax:=max(lmax,rmax);
fmin:=min(lmin,rmin);
end{if}
end{MaxMin}
时间复杂度:最坏:
3
n
2
−
2
\frac{3n}{2}-2
23n−2 , 平均:
3
n
2
−
2
\frac{3n}{2}-2
23n−2
T
(
n
)
=
{
0
n = 1
1
n = 2
T
(
⌈
n
/
2
⌉
)
+
T
(
⌊
n
/
2
⌋
)
+
2
n > 2
T(n)=\begin{cases} 0& \text{n = 1}\\ 1& \text{n = 2}\\ T(\lceil n/2 \rceil)+T(\lfloor n/2 \rfloor) + 2& \text{n > 2}\end{cases}
T(n)=⎩⎪⎨⎪⎧01T(⌈n/2⌉)+T(⌊n/2⌋)+2n = 1n = 2n > 2
当n是2的方幂时,设
n
=
2
k
n = 2^k
n=2k,有
T
(
n
)
=
3
n
2
−
2
T(n) = \frac{3n}{2}-2
T(n)=23n−2
实际上,任何一种元素比较为基础的找最大最小元素的算法,其元素比较次数的下界是
T
(
n
)
=
3
n
2
−
2
T(n) = \frac{3n}{2}-2
T(n)=23n−2
搜索算法的时间下界(基于比较):
折半搜索:时间复杂度为:
O
(
log
n
)
O(\log n)
O(logn)
二元搜索树:树的高度
最小比较次数:
F
(
n
)
,
二元搜索树的高度:
k
,
内部节点数目:
n
\text{最小比较次数:}F(n),\text{二元搜索树的高度:}k,\text{内部节点数目:}n
最小比较次数:F(n),二元搜索树的高度:k,内部节点数目:n
n
<
=
2
k
−
1
n <= 2^k - 1
n<=2k−1
F
(
n
)
=
k
>
=
⌈
log
(
n
+
1
)
⌉
F(n) = k >= \lceil \log(n+1)\rceil
F(n)=k>=⌈log(n+1)⌉
排序算法
插入排序:
Insert Insort 主要是这两种操作
最坏时间的时间复杂度为:
O
(
n
2
)
O(n^2)
O(n2),主要的时间都花在移动元素上面,为了解决这一问题采用分治的思想。
归并排序:
MergeSort(low,high)
integer low,high;
if low<high then
mid := (low+high)/2
MergeSort(low,mid)
MergeSort(mid+1,high)
Merge(low,mid,high)
end{if}
end{MergeSort}
归并排序树:
得到:假定合并过程所用时间与n成正比,cn
T
(
n
)
=
{
a
n = 1
2
T
(
n
/
2
)
+
c
n
n > 1
T(n)=\begin{cases} a& \text{n = 1}\\ 2T(n/2) + cn& \text{n > 1}\\ \end{cases}
T(n)={a2T(n/2)+cnn = 1n > 1
以比较为基础的排序时间的下界:
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)
排序比较树:
证明:
从根节点到叶节点的每一条路径与一种唯一的排列相对应,由于n个元素,所以排列共有
n
!
n!
n!个不同的排列,比较树有
n
!
n!
n!个外部节点。
设排序比较树的高度为K,则该二叉树的外节点至多是
2
k
2^k
2k个。于是
n
!
<
=
2
k
n!<= 2^k
n!<=2k
n
!
⩾
n
(
n
−
1
)
.
.
.
(
⌈
n
/
2
⌉
)
⩾
(
n
/
2
)
n
/
2
−
1
n! \geqslant n(n-1)...(\lceil n/2\rceil) \geqslant (n/2)^{n/2-1}
n!⩾n(n−1)...(⌈n/2⌉)⩾(n/2)n/2−1
k
⩾
(
n
/
2
−
1
)
log
(
n
/
2
)
=
O
(
n
log
n
)
k \geqslant (n/2-1)\log(n/2) = O(n\log n)
k⩾(n/2−1)log(n/2)=O(nlogn)
仔细观察。归并排序有两个值得注意的点,当元素较少的时候,可以直接进行直接排序,性能可能更好。第二是辅助数组B的应用,改善方法是使用链表的归并排序算法。
快速排序算法:
算法 | 最坏复杂性 | 平均复杂性 |
---|---|---|
冒泡排序 | n 2 n^2 n2 | n 2 n^2 n2 |
插入排序 | n 2 n^2 n2 | n 2 n^2 n2 |
选择排序 | n 2 n^2 n2 | n 2 n^2 n2 |
快速排序 | n 2 n^2 n2 | n log n n\log n nlogn |
归并排序 | n log n n\log n nlogn | n log n n\log n nlogn |
选择问题
问题1:已知n元数组A[1…n],试确定其中第k小的元素
1,快速排序算法
2,快速排序算法在挑选比较元素的时候做了改进,取正整数r,分成n/r段,求中间元素,然后这
⌊
n
/
r
⌋
\lfloor n/r \rfloor
⌊n/r⌋元素搜集在数组A的前部
S
e
l
e
c
t
(
A
,
m
,
m
+
⌊
n
/
r
⌋
−
1
,
⌈
⌊
n
/
r
⌋
/
2
⌉
)
Select(A,m,m+ \lfloor n/r \rfloor -1 ,\lceil \lfloor n/r \rfloor/2 \rceil)
Select(A,m,m+⌊n/r⌋−1,⌈⌊n/r⌋/2⌉)
For Example : r=5
v 是挑选出来的比较元素的中间值
A中至多有多少个元素>v
n
−
1.5
∗
⌊
n
/
5
⌋
<
=
0.7
n
+
1.2
<
=
0.75
n
=
3
n
/
4
n - 1.5 * \lfloor n/5 \rfloor <= 0.7n+1.2 <= 0.75n =3n/4
n−1.5∗⌊n/5⌋<=0.7n+1.2<=0.75n=3n/4
T
(
n
)
<
=
T
(
n
/
5
)
+
T
(
3
n
/
4
)
+
c
n
=
O
(
n
)
T(n) <= T(n/5) + T(3n/4) + cn = O(n)
T(n)<=T(n/5)+T(3n/4)+cn=O(n)
关于矩阵乘法
T ( n ) = { b n <= 2 7 T ( n / 2 ) + a n 2 n > 2 T(n)=\begin{cases} b& \text{n <= 2}\\ 7T(n/2) + an^2& \text{n > 2}\\ \end{cases} T(n)={b7T(n/2)+an2n <= 2n > 2
快速Fourier变换
T ( n ) = { a if n=1 2 T ( n / 2 ) + c n if n >= 1 T(n)=\begin{cases} a& \text{if n=1 }\\ 2T(n/2) + cn& \text{if n >= 1}\\ \end{cases} T(n)={a2T(n/2)+cnif n=1 if n >= 1
最接近点对问题
2-dimision:
T
(
n
)
=
{
a
n < 4
2
T
(
n
/
2
)
+
c
n
n >= 4
T(n)=\begin{cases} a& \text{n < 4}\\ 2T(n/2) + cn& \text{n >= 4}\\ \end{cases}
T(n)={a2T(n/2)+cnn < 4n >= 4
other questions
见附件