分治法的主要思想为:
1.将问题划分为许多子问题,化整为零,直到划分到足够小,再一层层的返回
2.解决子问题
3.将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上的逐步求出原来问题的解(重要)
一、二分搜索
1.用递归的方法做
/*递归方法*/
#include <stdio.h>
int binarySeach(int a[],int begin,int end,int key)
{
int middle =(begin + end) / 2;
if(a[middle] == key)
return middle;
else if (a[middle] < key)
{
return binarySeach(a,middle+1,end,key);
}
else if (a[middle] > key)
{
return binarySeach(a,begin,middle-1,key);
}
else return -1;
}
int main() {
int result = 0;
int a[8] = {0,3,5,7,56,3335,11113,6000000};
result = binarySeach(a,0,7,2);
printf("%d",result);
return 0;
}
2.用迭代的方法做
/*用迭代的方法做*/
#include<stdio.h>
int binarySeach(int a[],int key,int length)
{ int left = 0;
int right = length - 1;
while(left <= right)
{
int middle = (left + right) / 2;
if(key == a[middle])
return middle;
else if(key > a[middle])
left = middle + 1;
else right = middle - 1;
}
return -1;
}
int main()
{
int result = 0;
int a[8] = {0,3,5,7,8,10,34,89};
result = binarySeach(a,89,8);
printf("%d",result);
return 0;
}
算法复杂度分析:最好情况下O(1),最坏情况下,O(logn)
二、幂运算
#include <stdio.h>
int power(int a,int n)
{ if(n == 0)
{
return 1;
}
if(n % 2 == 0)
{//n为偶数,可以分为两个n/2
return power(a * a,n / 2);
}
else
{
return power(a * a,n / 2) * a;
}
}
int main() {
int a = 10;
int n = 3;
int result = power(10,3);
printf("%d",result);
}
时间复杂度为O(logn)
三、大整数乘法
x,y都是n位二进制数字,要计算他们的乘积xy,通过分治法,将n位的二进制整数x和y都分成两段,每段的长为n/2位。
乘法次数:4次n/2位的整数乘法
加法次数:3次整数加法
移位次数两次
时间复杂度为O(n^2),并没有发生什么变化
更新的大整数乘法,通过数学的变换,将ac bd结果保存,这样只需进行三次乘法操作即可,时间复杂度也降低了。