算法成长日志——分治法(二分查找,幂运算,大整数乘法)

分治法的主要思想为:

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结果保存,这样只需进行三次乘法操作即可,时间复杂度也降低了。

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值