算法导论第二版笔记之分治法

原创 2015年02月28日 16:19:21

//朴素的算法     解决a的n次方相乘问题

#include<iostream>

#include<cstdlib>

 

usingnamespace std;

int main()

{

    double a;

    cin >> a;

    int n;

    cin >> n;

   

    for (int i = 1; i < n; i++)//a*a*a*a*......a,n个a相乘,时间复杂度为O(n)

    {

         a *= a;

    }

    cout << a << endl;

 

    system("pause");

 

    return 0;

}

 

 

//分治算法 解决a的n次方相乘问题时间复杂度为O(lgn)

#include<iostream>

#include<cstdlib>

#include<cmath>

usingnamespace std;

 

double calc(doublea, intn)

{

    if (n == 1)

    {

         returna;

    }

    if (n % 2 == 0)//每次相乘只递归n/2次方的相乘,在加上一次平方

    {

         return pow(calc(a, n / 2), 2);

    }

    return pow(calc(a, (n - 1) / 2), 2)*a;

}

 

int main()

{

    double a;

    cin >> a;

 

    int n;

    cin >> n;

 

    cout << calc(a, n) << endl;

 

    system("pause");

    return 0;

}

 

//斐波那契数列朴素算法 时间复杂度O(n)

#include<iostream>

#include<cstdlib>

#include<cmath>

usingnamespace std;

 

int main()

{

    int f1 = 0, f2 = 1,f3;

    int n;

    cin >> n;

 

    for (int i = 2; i < n; i++)

    {

 

         f3 = f1 + f2;

         f1 = f2;

         f2 = f3;

 

    }

    cout << f3 << endl;

 

    system("pause");

    return 0;

}

// 第 n个 Fibinacci 数的 O(lgn) 时间复杂度的求法    高手写的 只懂原理    

 

#include<iostream>

#include<cstdlib>

usingnamespace std;

 

template <classT>

structFibMat

{

    T f00;

    T f01;

    T f10;

    T f11;

    FibMat(T a = 0, T b = 1, T c = 1, T d = 1);

    void print();

};

 

template <classT>

FibMat <T>::FibMat(Ta, Tb, Tc, Td)

{

    f00 = a;

    f01 = b;

    f10 = c;

    f11 = d;

}

 

template <classT>

voidFibMat <T>::print()

{

    cout << f00 << ' ' << f01<< endl;

    cout << f10 << ' ' << f11<< endl;

}

 

template <classT>

FibMat <T> FibMat_Mul(FibMat <T> & a, FibMat <T> & b)

{

    T f00 = a.f00 * b.f00 + a.f01 * b.f10;

    T f01 = a.f00 * b.f01 + a.f01 * b.f11;

    T f10 = a.f10 * b.f00 + a.f11 * b.f10;

    T f11 = a.f10 * b.f01 + a.f11 * b.f11;

    returnFibMat <T>(f00, f01, f10, f11);

}

 

template <classT>

T FibCounter(intp)

{

    FibMat <T> fm(0, 1, 1, 1);   // 计算fm 的 p 次幂,返回右下角的元素

    FibMat <T> fm_pow(0, 1, 1, 1);

    int j = 1;

    while (j <= p)

    {

         j <<= 1;

    }

    j >>= 1;    //    j 是不超过 p 的 2 幂

    while (j >>= 1)

    {

         fm_pow = FibMat_Mul(fm_pow, fm_pow);

         if (j & p)

         {

             fm_pow = FibMat_Mul(fm_pow, fm);

         }

    }

    return fm_pow.f11;

 

}

 

int main()

{

    int i;

    for (i = 1; i < 91; i++)

    {

         cout << FibCounter <longlong>(i) <<endl;

    }

    system("pause");

    return 0;

}

//    还有一个n阶矩阵看着蛋疼 没有码

 

 

 

 


相关文章推荐

MIT算法导论学习笔记-Lecture4 分治法(续)

第四讲:分治法(续) 4.1 快速排序(Quicksort)

《算法导论》读书笔记(二)——分治法

设计算法 插入排序使用了增量法,即先排j-1个,然后排j个,下面学习一种新的方法:分治法。 分治法 分治法的思想:大事化小,分而治之。把规模较大的问题分解为几个规模较小的类似子问题,递归的求解子问题,...

算法导论笔记一:算法设计之分治法

分治法的设计思想是利用某些算法递归的特性,将原问题分解为n个结构相似的子问题,递归解决这些子问题,在合并其结果,便得到原问题的解,代表算法为合并排序法。     合并排序法的原理是将原序列分为两个子...

算法导论之分治法

分治法:主要算法思想就是divide and conquer

算法导论学习1--分治法计算逆序数

闲来无事,复习复习经典的算法导论。看到了2-4,习题,计算逆序数的问题,忍不住实现了一下。   逆序数,是排列组合中常见的一个指标,可以用来衡量一个数列的杂乱成对(相对于顺序排列),在一些算法如水...
  • cpfeed
  • cpfeed
  • 2011年09月06日 00:43
  • 4234

算法导论学习2.3 分治法 (这个递归终于懂了。。)

import java.util.Arrays; public class MergeSort { public static void main(String[] args) { ...

[算法导论]分治法---最大子数组

分治策略---最大自子数组 一、分治策略的三个步骤 1、分解:将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小 2、解决:递归地求解出子问题。如果子问题的规模足够小...

算法导论第2章(4) 分治法的应用 找逆序对 (习题2-4)

第二章习题2-4 逆序对的概念:数组s[0...N]中如果ij就表示有一个逆序对 问题:对任意一个数组求其逆序对。 可以使用分治法:对于一个数组S将其分为2个部分S1和S2,求S1和S2的逆序...

算法导论-分治法-最近点对-HDOJ1007

HDOJ1007的原题目是求出在不同时套中两个玩具的前提下,圆圈的最大半径。问题翻译过来就是求解最近点对的问题,这个问题是经典的分治法问题。 参考博客:http://www.cnblogs.com/p...
  • jkhere
  • jkhere
  • 2014年03月20日 10:38
  • 3221

【算法导论】分治法及归并排序

有很多算法,在结构上他们是递归的:weile
  • Eaton18
  • Eaton18
  • 2014年09月18日 00:39
  • 352
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法导论第二版笔记之分治法
举报原因:
原因补充:

(最多只允许输入30个字)