算法图解的一点总结

《算法图解》这本书不错,就像书封面说的一样,像小说一样有趣的算法入门书。在这里记下我学习的笔记。

一、大O表示法

  1. 大O表示法:指出了算法需要执行的操作数,指出了最糟情况下的运行时间
  2. 一些常见的大O运行时间

    从快到慢

    O( log n ),即对数时间,这样的算法包括二分查找 
    O( n ),即线性时间,这样的算法包括简单查找 
    O( nlog n ),这样的算法包括快速排序,即一种较快的排序算法 
    O( n*n ),这样的算法包括选择排序,即一种速度较慢的排序算法 
    O( n! ),这样的算法包括旅行商问题的解决方案,即一种非常慢的算法

二、递归

  1. 递归函数包含递归条件和基线条件
    • 递归条件:函数调用自己
    • 基线条件:函数不再调用自己
  2. 调用栈

三、快速排序

  1. 分而治之(divide and conquer,D&C):递归式问题的解决方法。
    • 用D&C解决问题包括两个步骤①找出简单的基线条件②将问题不断分解(或者说缩小规模),直到符合基线条件
    • 每次递归调用都必须将问题规模缩小 
    • 递归在记录状态
    • 提示:编写涉及数组的递归函数时,基线条件通常是数组为空或只包含一个元素

   2.快速排序

     步骤

      (1)选择基准值

      (2)将数组分成两个子数组:小于基准值的元素和大于基准值的元素

      (3)对这两个子数组进行快速排序

四、狄克斯特拉算法

  1. 找出加权图中前往X的最短路径
  2. 适用于有向无环图(不能有负权边),含有负权边的用贝尔曼-福德算法
  3. 关键理念:找出图中最便宜的节点,并确保没有到该节点的更便宜的路径
  4. 步骤
    • 找出“最便宜”的节点
    • 对于该节点的邻居,检查是否有前往它们的更短路径,如果有,更新该节点的邻居的开销
    • 重复这个过程,直到对图中每个节点都这样做了
    • 计算最终路径  

五、贪心

六、动态规划

  1. 动态规划可在约束条件下找到最优解
  2. 分解的每个子问题必须是离散的,不依赖于其他子问题时,动规才有用
  3. 每种动态规划解决方案都涉及网格
  4. 网格中的值通常是你要优化的值
  5. 每个单元格都是一个子问题,要考虑如何将问题分成子问题,找出网格的坐标轴
  6. 绘制网格
    • 单元格中的值是什么
    • 如何将这个问题划分成子问题
    • 网格的坐标轴是什么

  弗曼算法

    • 将问题写下来
    • 好好思考
    • 将答案写下来    

七、K最邻近算法  

 

posted @ 2017-06-08 21:52  sakuraxx  阅读(312)  评论(0编辑  收藏  举报