算法策略
算法策略
AnEra
厚积薄发, 天道酬勤
展开
-
10大排序算法
前言 排序算法的稳定性: 如果相等的2个元素,在排序前后的相对位置保持不变,那么这是稳定的排序算法 排序前:5, 1, 3????, 4, 7, 3???? 稳定的排序: 1, 3????, 3????, 4, 5, 7 不稳定的排序:1, 3????, 3????, 4, 5, 7 对自定义对象进行排序时,稳定性会影响最终的排序效果 冒泡排序 思路: 1. 从头开始比较每一对相邻元素,如果第1个比第2个大,就交换它们的位置; 执行完一轮后,最末尾那个元素就是最大的元素 2.原创 2020-08-14 20:05:36 · 303 阅读 · 0 评论 -
最小生成树: Prim算法、Kruskal算法
目录 生成树(Spanning Tree) 最小生成树(Minimum Spanning Tree) 切分定理 Prim算法 Prim算法 – 执行过程 Prim算法 – 实现 Kruskal算法 Kruskal算法 – 执行过程 Kruskal算法 – 实现 Prim算法、Kruskal算法中使用的最小堆和并查集 最小堆 并查集 生成树(Spanning Tree) 生成树(Spanning Tree),也称为支撑树, 连通图的极小连通子图, 它含有图中全部的 n 个顶点,..原创 2020-09-04 16:44:31 · 591 阅读 · 1 评论 -
最短路径: Dijkstra算法、Bellman-Ford算法、Floyd算法
目录 最短路径(Shortest Path) 最短路径 – 无权图 最短路径 – 负权边 最短路径 – 负权环 最短路径算法 Dijkstra (迪杰斯特拉算法) Dijkstra –思路 Dijkstra – 执行过程 Dijkstra –代码实现 Bellman-Ford (贝尔曼-福特算法) Bellman-Ford–思路 Bellman-Ford–思考 Bellman-Ford –执行过程 Bellman-Ford –代码实现 Floyd (弗洛伊德算法...原创 2020-09-07 12:14:53 · 1697 阅读 · 2 评论 -
快慢指针判断链表中是否存在环以及查找环的起始位置
判断链表中是否有环? 使用快慢指针, 慢指针一次走一步, 快指针一次走两步, 当快慢指针相遇时,说明链表存在环 为什么快指针每次走两步而慢指针每次走一步呢? 因为slow指针和fast指针都会进入环内, 就像在环形跑道内不同位置的两个人;slow指针在后面, fast指针在前面, 但实际上fast指针也在追slow指针, 希望能在环内超slow指针一圈(当超过一圈时会 相遇)。那么fast指针总会追上slow指针的; 那么fast指针会不会跳过slow指针呢(为什么快慢指针的步骤差必须为1呢)...原创 2020-11-05 17:21:38 · 816 阅读 · 2 评论 -
算法策略 - 动态规划
目录 动态规划(Dynamic Programming) 动态规划的常规步骤 动态规划的一些相关概念 无后效性 有后效性 算法1 – 找零钱 问题 状态定义 题解– 暴力递归 题解– 记忆化搜索 题解– 递推 思考题: 请输出找零钱的具体方案 (具体是用了哪些面值的硬币) 题解– 通用实现优化 算法2 – 最大连续子序列和 问题 状态定义 状态转移方程和初始状态 题解– 动态规划 – 实现 题解– 动态规划 – 优化实现 算法3 – 最长上升子序列 (LI...原创 2020-09-16 16:25:18 · 1322 阅读 · 1 评论 -
算法策略 - 分治
分治(Divide And Conquer) 分治,也就是分而治之。它的一般步骤是(1) 将原问题分解成若干个规模较小的子问题(子问题和原问题的结构一样,只是规模不一样) (2) 子问题又不断分解成规模更小的子问题,直到不能再分解(直到可以轻易计算出子问题的解) (3) 利用子问题的解推导出原问题的解 因此,分治策略非常适合用递归, 需要注意的是:子问题之间是相互独立的 分治的应用 快速排序 归并排序 Karatsuba算法(大数乘法) 主定理(Master Theorem) 练习1..原创 2020-09-11 18:07:10 · 209 阅读 · 1 评论 -
算法策略 - 贪心
目录 贪心(Greedy) 练习1 – 最优装载问题(加勒比海盗) 问题 思路 代码实现 练习2 – 零钱兑换 问题 思路 代码实现 贪心策略中存在的问题 注意: 练习3 – 0-1背包 问题 思路 实例分析 代码实现 贪心(Greedy) 贪心策略,也称为贪婪策略, 每一步都采取当前状态下最优的选择(局部最优解),从而希望推导出全局最优解 贪心的应用: 哈夫曼树 最小生成树算法:Prim、Kruskal 最短路径算法:Dijkstra 练习1 – 最优装载问题(加勒原创 2020-09-11 17:25:38 · 333 阅读 · 1 评论 -
回溯: N皇后问题
目录 回溯 (Back Tracking) N皇后问题 (NQueens) 解决思路 四皇后 – 回溯法 四皇后 – 剪枝(Pruning) 八皇后 – 回溯法流程 N皇后问题– 实现 N皇后问题–优化1 N皇后问题–优化2 回溯 (Back Tracking) 回溯可以理解为: 通过选择不同的岔路口来通往目的地(找到想要的结果) 每一步都选择一条路出发, 能进则进, 不能进则退回上一步(回溯), 换一条路再试 树、图的深度优先搜索(DFS)、八皇后、走迷宫都是典型的回溯应...原创 2020-09-09 18:30:27 · 292 阅读 · 0 评论 -
递归(Recursion)
递归(Recursion) 递归: 函数(方法)直接或间接调用自身 函数的调用过程 函数的递归调用过程 如果递归调用没有终止, 将会一直消耗栈空间, 最终导致栈内存溢出(Stack Overflow), 所以必需要有一个明确的结束递归的条件, 也叫作边界条件、递归基 实例分析 求 1+2+3+...+(n-1)+n 的和 (n>0) 实例1: 总消耗时间 T(n)=...原创 2020-09-08 17:34:51 · 450 阅读 · 1 评论