算法图解的一点总结
《算法图解》这本书不错,就像书封面说的一样,像小说一样有趣的算法入门书。在这里记下我学习的笔记。
一、大O表示法
- 大O表示法:指出了算法需要执行的操作数,指出了最糟情况下的运行时间
- 一些常见的大O运行时间
从快到慢
O( log n ),即对数时间,这样的算法包括二分查找
O( n ),即线性时间,这样的算法包括简单查找
O( nlog n ),这样的算法包括快速排序,即一种较快的排序算法
O( n*n ),这样的算法包括选择排序,即一种速度较慢的排序算法
O( n! ),这样的算法包括旅行商问题的解决方案,即一种非常慢的算法
二、递归
- 递归函数包含递归条件和基线条件
- 递归条件:函数调用自己
- 基线条件:函数不再调用自己
- 调用栈
三、快速排序
- 分而治之(divide and conquer,D&C):递归式问题的解决方法。
- 用D&C解决问题包括两个步骤①找出简单的基线条件②将问题不断分解(或者说缩小规模),直到符合基线条件
- 每次递归调用都必须将问题规模缩小
- 递归在记录状态
- 提示:编写涉及数组的递归函数时,基线条件通常是数组为空或只包含一个元素
2.快速排序
步骤
(1)选择基准值
(2)将数组分成两个子数组:小于基准值的元素和大于基准值的元素
(3)对这两个子数组进行快速排序
四、狄克斯特拉算法
- 找出加权图中前往X的最短路径
- 适用于有向无环图(不能有负权边),含有负权边的用贝尔曼-福德算法
- 关键理念:找出图中最便宜的节点,并确保没有到该节点的更便宜的路径
- 步骤
-
- 找出“最便宜”的节点
- 对于该节点的邻居,检查是否有前往它们的更短路径,如果有,更新该节点的邻居的开销
- 重复这个过程,直到对图中每个节点都这样做了
- 计算最终路径
五、贪心
六、动态规划
- 动态规划可在约束条件下找到最优解
- 分解的每个子问题必须是离散的,不依赖于其他子问题时,动规才有用
- 每种动态规划解决方案都涉及网格
- 网格中的值通常是你要优化的值
- 每个单元格都是一个子问题,要考虑如何将问题分成子问题,找出网格的坐标轴
- 绘制网格
-
- 单元格中的值是什么
- 如何将这个问题划分成子问题
- 网格的坐标轴是什么
弗曼算法
-
- 将问题写下来
- 好好思考
- 将答案写下来
七、K最邻近算法
每天进步一点点,不要停止前进的脚步~