分治法

Posted legoxz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分治法相关的知识,希望对你有一定的参考价值。

乘方问题

输入一个实数x,一个整数n >= 0,计算xn

朴素算法即时对n个x连乘。

分治法:

  xn = xn/2 · xn/2           如果n为偶数

  xn = x(n-1)/2 · x(n+1)/2    如果n为奇数

T(n) = T(n/2) + θ(1) = θ(lg n)

#include<stdio.h>

double Power_Divide(double x, int n);

int main()
{
    int n;
    double x;
    scanf("%d%lf", &n, &x);
    printf("%.3f", Power_Divide(x, n));
    return 0;
}

double Power_Divide(double x, int n)
{
    if(n == 1)
        return x;
    else if(n % 2 == 0)
        return Power_Divide(x, n / 2) * Power_Divide(x, n / 2);
    else if(n % 2 != 0)
        return Power_Divide(x, (n + 1) / 2) * Power_Divide(x, (n - 1) / 2);
}

 

 

Bottom-up algorithm

自下而上递归解决的算法

 

在理论上,根据斐波那契数列的性质

可采用朴素平方递归式求第n项的斐波那契数列

Fn = Φn / √5   并取整至最接近的整数。可以用平方递归在 log n 的时间内计算出。

但是在现实的计算中无法实现。

根据斐波那契数列的一个定理:

技术分享图片通过计算矩阵的n次幂来得到Fn。

这时候是一个log n 的时间算法。

 

以上是关于分治法的主要内容,如果未能解决你的问题,请参考以下文章

棋盘覆盖问题——分治法——代码清晰易懂

递归与分治法

对分治法思想的体会及结对编程情况汇报

分治法

分治法 实现归并排序

算法分治法