zoukankan      html  css  js  c++  java
  • 《算法之道》精华 算法设计部分

    《算法之道》精华 算法设计部分

    • 本书作者邹恒明,作者另有一本书《数据结构之弦》,以及《操作系统之哲学原理》都是非常好的书
    • 这本书能够算得上是深入浅出。文笔非常好,作者加入了非常多自己的思考
    • 本文仅包含算法设计部分,算法分析略去,并没有严格依照章节顺序来记录

    附录 算法随想

    • 有人喜欢遍历,希望踏遍千山万水,人生丰富多彩;有人一生贪婪,眼界不宽,及时行乐;有人注定穷搜,辛辛苦苦,收获有限;有人善用时空均衡,用最少的时间办最多的事情。十分精明;有人会分治,再难的问题也能解决。有人动态规划,积少成多

    第三章 分治与递归

    • 生活中的样例:天平秤球以辨明次品;乘法运算;世界杯晋级赛。秦国合纵连横
    • 分治策略步骤:1,将问题分为若干小问题;2,递归解决这些子问题;3,合并子问题的解答,得到大问题的解
    • 标准分治策略的定义里面包括递归:T(n) = aT(n/b) + f(n)
    • 递归式复杂度大师解法:
      T(n) 
      = aT(n/b) + f(n) 
      = a^2T(n/b^2) + af(n/b) + f(n)
      = a^(log_b(n)) T(1) + a^(log_b(n-1) f(n/b^(log_b(n-1))) +...+a^2f(n/b^2) + af(n/b) + f(n)
      = O(n^log_b(a)) + sum(a^j f(n/b^j))|(j = 0...log_b(n-1))
    • 前项为递归树最后一层节点数。后项为递归树各层分治过程分解与合并的代价
    • f(n) < n^log_b(a)时。T(n) = O(n^log_b(a))
    • f(n) > n^log_b(a) : T(n) = O(f(n))
    • 算法题中常见分治样例:乘方运算、矩阵乘法、斐波那契数列的矩阵乘方解法、VLSI布线

    第四章 动态规划

    • 动态规划是一种更有针对性的分治,分解得到的小问题非常多反复,保存已经计算得到的结果能够免去反复计算
    • 动态规划每一步做出一个最优选择。该最优选择与子问题的最优解组合得到大问题的最优解
    • 详细步骤:
      1. 证明问题的解决方式中包含一个选择,选择后剩下一个或多个子问题
      2. 设计递归描写叙述方式。得到递归方程
      3. 证明对大问题的最优解包含对全部子问题的最优解
      4. 证明子问题之间重叠
    • 两个原则:最优子结构。重叠子问题
    • 动态规划的时间复杂度:所有子问题数量x选择成本
    • 算法题中常见动态规划样例:最长公共子序列(最长递增、最长递减子序列,编辑距离)、最优二叉搜索树

    第五章 贪婪选择思想

    • 动态规划在做出选择之前。将全部选择的结果做了比較。而假设选择的时候不经过比較,而是直接选择局部最优,就是贪婪
    • 贪婪的目的仅仅是找出一种可行解。在一定情况下找出的是最优解
    • 贪婪与动态规划同样。都是一种分治策略。但与动态规划不同,贪婪将大问题分解为一个,而不是多个子问题
    • 详细步骤:
      1. 将原问题表述为一个做出一个选择,然后剩下唯一一个子问题的形式
      2. 证明全部的最优选择里面总有一个是贪婪选择
      3. 证明贪婪选择加上对剩下子问题的最优解导致大问题的最优解
    • 贪婪的两个原则:最优子结构(大问题的最优解包含小问题的最优解),贪婪选择属性
    • 贪婪选择属性:每一个小问题能够贪婪选择获得
    • 算法题中常见贪婪样例:
      • 背包问题:財宝能否够切割、每件財宝能否够反复拿四个版本号
      • 教室课程规划
      • 最小生成树
        • Kruskal算法,每次增加一个不形成环的最小的边。复杂度为O(E log(V))
        • Prime算法:每次增加距离近期的点。并降距。复杂度为O(V^2),採用堆实现。能够达到O(E log(V))
      • 霍夫曼编码

    第六章 随机化思想

    • 蒙特卡洛算法:大概率输出正确答案。复杂度固定
    • 常见随机化算法样例:
      • 素性測试:依据费马小定理,若p为素数,则(a^p - a) % p == 0。假设測试一百次都成立,则为合数的概率仅仅有2^(-100)
      • 矩阵乘积结果验证:取随机二进制01矢量z,有zAB = z(AB)
      • 线性时间最小生成树算法

      
      

    转载请注明作者:Focustc,博客地址为http://blog.csdn.net/caozhk,原文链接为点击打开

      
      
  • 相关阅读:
    PyQt4 调用串口API pySerial API说明
    树的计算
    数据结构单链表实现
    虚函数和抽象函数
    静态内存和堆栈
    二叉树学习图片---郝斌
    汉诺塔
    循环队列的实现
    队列的实现
    栈的应用
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5173571.html
Copyright © 2011-2022 走看看