目录
算法概述
基本概念
算法是指解决问题的一种方法或一个过程
算法是由若干条指令组成的有穷序列
算法的性质:输入、输出、有限性、确定性、可行性
输入:0个或多个由外部提供的量作为算法的输入
输出:算法产生至少一个量作为输出
确定性:组成算法的每条指令是清晰的、无歧义的
有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的
时间复杂度空间复杂度
算法的复杂性有时间复杂性和空间复杂性之分。(算法需要时间/空间资源的量)
算法的复杂性是 算法效率和计算效率 的度量,是评价算法优劣的重要依据。
衡量一个算法好坏的标准是时间复杂度低
计算一个算法时间复杂度通常可以通过计算循环次数、基本操作的频率 或计算步数来实现。
符号
O渐近上界,Ω渐近下界,θ紧渐近界
t(n)=Ο(g(n)),存在c和n0对所有n>=n0有0<=t(n)<=cg(n)
t(n)=Ω(g(n)), 存在c和n0对所有n>=n0有0<= cg(n) <= t(n)
t(n)=θ(g(n)), 存在c1,c2和n0对所有n>=n0有c1g(n) <= t(n)<=c2g(n)
递归与分治
递归:1.定义递推2.解法存在自调用
用到递归的方法都是自底向上的
分治性质
最优子结构性质
分而治之
算法思想
将一个难以解决的大问题,分解为规模较小的相同子问题,直至这些子问题容易直接求解,并且可以利用这些子问题的解求出原问题的解。分而治之。
1. 子问题的解可以合并2. 原问题和子问题使用相同的方法解3.目标函数与最优解之间存在依赖关系4.子问题不能出现交集
典型问题
二分搜索O(logn)
循环赛日程表
合并排序O(nlogn)
快速排序O(nlogn)~O(n2)
快速排序算法的性能取决于划分的对称性
棋盘覆盖O(4k)
棋盘覆盖问题 实现的基本原理是将 2^k * 2^k 的棋盘分成四块 2^ (k - 1) * 2^ (k - 1)的子 棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中, 继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止。
0/1背包问题不能用分治策略
动态规划
动态规划性质
最优子结构性质
重叠子问题性质
算法思想
把要求解问题分解成多个子问题,按顺序求解子问题,最后一个子问题的解就是初始问题的解。
子问题往往有重叠部分
动态规划步骤
- 找最优解性质
- 找递归关系定义最优解
- 计算最优值(自底向上)
- 构造最优解(不是基本步骤,问题可能不需要计算出最优解)
典型问题
0/1背包问题O(min{nc,2n})
最长公共子序列O(mn)
矩阵连乘O(n3)
最大子段和O(n)
解决0/1背包问题可以使用动态规划、回溯法和分支限界法,其中不需要排序的是动态规划 ,需要排序的是回溯法、分支限界法。
其他
备忘录方法:用表格保存已解决的子问题的答案,备忘录是自顶向下的,动态规划是自底向上的
贪心算法
贪心算法性质
最优子结构性质
贪心选择性质
算法思想
做出在当前看来最好的选择,选择局部最优解
典型问题
活动安排问题O(nlogn)
哈夫曼编码:O(nlogn)
单源最短路径O(n2)
最小生成树
背包问题(物体可划分)可用贪心算法O(nlogn),0/1背包问题不能
N皇后也不能用贪心算法
贪心算法于动态规划的异同:
动态规划自底向上,贪心自顶向下
都要求问题具有最优子结构性质。