分治策略

这里写图片描述##Merge Sort##
输入:数组 A[p…r}
输出:元素从小到大排序的数组A

 1. if p<r
2.then q<-(p+r)/2的下界
 2. Merge Sort(A,p,q)
 3. Merge Sort(A,q+1,r)
 4. Merge(A,p,q,r)

列表内容

BinarySearch

input:排好序的数组T,数x
output:j

1.L<-1,.R<-n;
2.while L<=R do
3.  m=[(L+N)/2]下界
4.  if T[m]=x then return m;
5.  else if T[m]>x then  R<- m-1
6.  else L<- m+1;
7.return 0;

算法Hanoi(A,C,N)//n 个盘子A到C

1.if n==1 then move(A,C)
2.else Hanoi (A,B,N-1)
3.  move(A,C)
4.  Hanoi(B,C,N-1)

芯片测试

输入: N 片芯片,好芯片至少比坏芯片多1 片
设计一种方法挑出一片好的芯片,要求最小的测试次数

问题:A,判定A的好坏
方法:用 n-1的芯片对A测试
n为奇数,好芯片数>=(n+1)/2
A好,(n-1)/2报告好芯片
A坏,(n+1)/2报告“坏”

结论: 至少一半报好,A为好芯片
超过一半报坏,A为坏芯片

n 为偶数 n/2+1
A好, n/2 报好
A坏,n/2+1 报坏

蛮力算法
O(n²)
test(n)

1.k<-n
2.while  k>3_do
3. 芯片分成[k/2]下界组,//轮空处理
4.     for i=1 to [k/2]  do 
5.          if  两片好hen 任取一片
6.          else  2片同时丢掉  
7.     k<-剩下的芯片数
8. if k=3  then
9.    任取2片芯片测试
10.   if 11then 取剩下的那个
11.  else 任取一片被测芯片
12.if k=2 or 1 then 任取1

w(n)=w(n/2)+O(n)
w(3)=1,w(2)=w(1)=0;

w(n)=O(n);

快速排序

QuickSort(A,p,r)
输入:A[p…r]
输出:排序

1. if p<r 
2.  then q<- Partition (A,p,r)
3.          A[p]<-A[q]
4.          Quicksort (A,p,q-1)
5.          QuickSort(A,q+1,r)

Partition(A,p,r)
输入:数组A
输出:J,A的首元素在排好序的数组中

1.x<-A[P]
2.i<- p
3.j<- r+1
4.while true do
5.     repeat j<- j-1
6.     until    A[j]<=x
7.     repeat i<- i+1
8.     until     A[i]>=x
9.      if i<j
10.    then A[i]<->A[j]
11.    else  return j

w(n)=w(n-1)+n-1
w(n)=n(n-1)/2
最好的划分:T(n)=2T(n/2)+n-1
T(n)=紧的界(nlogn)

C 语言实现整个快速排序的过程

#include <stdio.h>
 int a[101],n;
void quicksort(int left,int right){
    int i,j,t,temp;
    if(left>right)
        return;

    temp=a[left];
    i=left;
    j=right;
    while(i!=j){
        while(a[j]>=temp && i<j)
            j--;
        while(a[i]<=temp && i<j)
            i++;

        if(i<j){
            t=a[i];
            a[i]=a[j];
            a[j]=t;
        }

    }
    a[left]=a[j];
    a[j]=temp;
    quicksort(left,j-1);
    quicksort(j+1,right);
    return;
}
int main (){
    int i,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    quicksort(1,n);
    for(i=1;i<=n;i++)
        printf("%d ",a[i]);

    return 0;
}

幂乘

w(n)=w(n/2)+紧的界(1)
w(n)=紧的界(log n)
Fibonacci数列
Fn=Fn-1+Fn-2
T(n)=紧的界(n)

M=[ 1 1
1 0] ,用乘幂算法计算法M^n;
T(n)=紧的界(log n)

减少子 问题的个数

W(n)=aW(n/b)+d(n)
a:子问题数,n/b:子问题规模
d(n):划分与综合工作量
当a较大,b较小,d(n)不大时候,方程解:
W(n)=紧的界(n^logb a)
减少a是降低函数W(n)的jie的途径

for example 1: 整数位乘
输入:X,Y是n位二进制数,n=2^k
输出: XY
O(n^2)次位乘运算
划分
X: A B
Y: C D
X=A*2^(n/2)+B;Y=C*2^(n/2)+D
X*Y=AC*2^(n)+(AD+BC)*2^(n/2)+BD;
W(n)=4W(n/2)+O(n)
W(n)=O(n²);

AD+BC=(A-B)(D-C)+AC+BD
减少为三个子问题!
W(n)=3W(n/2)+cn
W(1)=1

W(n)=O(n^(log3);

例2: 矩阵相乘
分治后依旧为O(n^3)

利用Strassen矩阵乘法

W(n)=7W(n/2)+18(n/2)^2
W(1)=1
W(n)=O(n^log7)=O(n^2.8075)
上界O(n^2.376)
下界O(n^2)

适合用于子问题个数多,划分和综合工作量不大,时间复杂度W(n)=紧的界(n^(logb a))
综合解的工作量可能会增加,但增加的工作量不影响W(n)的阶;

增加预处理

例子:平面点对问题
C(n,2) ->O(n²)

分治:P划分为PL,PR
1.计算PL,PR中最近点对

2.计算PL和PR中各一个点的最近点对

3.上述情况中的最近点对是解

3

2

1

这里写图片描述

根据算法顺序 :cbafde
这里写图片描述

324154为解的顺序

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值