算法2

算法的分类

  1. 精确算法(exact algorithm),总能保证求得问题的解
  2. 启发式算法(heuristic algorithm),通过使用某种规则,简化或智能猜测来减少问题求解时间。不能保证是问题的最优解,甚至不一定是问题的可行解(feasible solution)

PS:对于最优化问题,一个算法如果致力于寻找近似解而不是最优解,被称为近似算法(approximation algorithm),求得的是问题的可行解,而不是最优解。

如何确认算法

  • 如果一个算法对于所有合法的输入,都能在有限时间内输出预期的结果,那么此算法是正确的。确认一个算法是否正确的活动称为算法确认(algorithm validation)
  • 使用数学方法证明算法的正确性,称为算法证明(algorithm proof)
    • 证明算法正确性常用的方法是数学归纳法
    • 要证明算法是不正确的,只要给出能够导致算法不能正确处理的输入即可

递归

  • 递归,定义一个新事物、新概念或新方法,一般要求在定义中只包含已经明确或证明的事物、概念或方法。然而递归却不然,递归(recursive)定义是一种直接或间接引用自身的定义方法。
  • 递归包含两个部分:基础情况和递归部分。
  • 最著名的斐波那契数列出场

    • 图片发自简书App

      这是它的递归定义,至到18世纪前,人们一直都只能采用递归定义来计算,它的直接计算公式太复杂了,看不懂,这里就不贴了。

    • 代码实现
  uint64_t Fib(uint64_t n)
  {
    if (n<=1) return n;
    return Fib(n-1)+Fib(n-2);
  }

挺简单的,是吧,但是,对,这种话后面一般都有但是
这个程序如果真的执行,最多也就到n=40左右,50基本上就看不到结果了,或者要等很久,因为递归嵌套太深了,所以,还要优化,

map<uint64_t, uint64_t> g_mapFib;
uint64_t Fibex(uint64_t n)
{
    if (n<=1){
        return n;
    }
    uint64_t t = g_mapFib[n];
    if (0 == t){
        t = Fibex(n-2) + Fibex(n-1);
        g_mapFib[n] = t;
    }
    
    return t;
}

使用map把计算过的值存起来,避免重复计算,然后速度就很快啦
这里用map纯粹是图方便,用vector,数组都可以的

  • 递归树可以用来描述递归程序的执行过程
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log ...
    面条168阅读 1,961评论 2 6
  • 上一章我们介绍了SVM算法的意义,SVM是large-margin算法,旨在找到一条能够完全区分训练集而且拥有最大...
    XiangLin阅读 6,365评论 3 20
  • 写下这个标题时,我意识到自己正拿着手机写字。 下午我和女儿在披萨店里等待烤肉串,我低着头看手机,偶然抬头看了女儿一...
    亲爱的小鱼啊阅读 727评论 2 1
  • 孙子讲:将者,智、信、仁、勇、严也。 孙子说:为将的人,需同时具体智、信、仁、勇、严这五个方面的基本能力。 孙子讲...
    功能美阅读 155评论 0 0
  • 宁静的夏夜, 一个风清云淡的夜晚, 一份悠然的心境; 坦然面对得与失, 微笑生活, 怡然于当下。
    ritazhong阅读 186评论 0 0

友情链接更多精彩内容