分治算法

分治算法

算法基本思想

一般而言,被分解的子问题应与原问题具有相同的类型,这样便于算法实现(多数情况下,采用递归算法)
分治算法流程:

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 23n2 , 平均: 3 n 2 − 2 \frac{3n}{2}-2 23n2
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)=23n2
实际上,任何一种元素比较为基础的找最大最小元素的算法,其元素比较次数的下界是 T ( n ) = 3 n 2 − 2 T(n) = \frac{3n}{2}-2 T(n)=23n2
搜索算法的时间下界(基于比较):
折半搜索:时间复杂度为: 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<=2k1
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(n1)...(n/2)(n/2)n/21
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/21)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/r1,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 n1.5n/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

见附件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值