主要内容
Why?
- 应用:机器学习、数据挖掘、自然语言处理、图形学等
- 研究:时空复杂度等
- 找工作:贪心、分治、动态规划、树、图等
- 考验代码能力(重点)
What?
- 大象放进冰箱
- 有穷性 必须在人类毁灭前结束
- 确定性 老板,便宜一点(一点是多少)
- 可行性 造个飞碟
- 输入&输出
How?
- 穷举(万能算法)
求N个数的全排列
8皇后问题 - 分而治之(减而治之)
二分查找——减而治之
归并排序——分而治之 - 贪心最小生成树 Prim, Kruskal
单源最短路 Dijkstra - 动态规划
背包
士兵路径
复杂度
• 谈算法不谈复杂度=耍流氓
• 硬件发展,速度提升、内存提升(常数级)
• 在实现之前,我们要预估算法所需要的资源 • 时间 • 空间
时空复杂度
使用大O记号(最坏情况,忽略系数)
时间:基本操作次数(汇编指令条数)
空间:占用内存字节数
区别:空间可以再利用
时空互换(Hash表)
- O(1) 基本运算,+,-,*,/,%,寻址
- O(logn) 二分查找
- O( n 1 / 2 n^{1/2} n1/2) 枚举约数
- O(n) 线性查找
- O( n 2 n^2 n2) 朴素最近点对
- O( n 3 n^3 n3) Floyd最短路 普通矩阵乘法
- O(nlogn)归并排序 快速排序的期望复杂度 基于比较排序的算法下界
- O(2n) 枚举全部的子集
- O(n!)枚举全排列
总结: 优秀 O(1) < O(logn) < O( n 1 / 2 n^{1/2} n1/2) < O(n) < O(nlogn)
可能可以优化 O( n 2 n^2 n2) < O( n 3 n^3 n3) < O( 2 n 2^n 2n) < O(n!)
常见时间复杂度分析方法
输入输出
数循环次数
均摊分析
多个操作,一起算时间复杂度
MULTIPOP的队列,可以一次性出队k个元素
每个元素只出入队列一次 动态数组尾部插入操作(vector)
一旦元素超过容量限制,则扩大一倍,再复制
我的收获
- 知道了学习算法的重要性
- 知道了时空复杂度
- 知道了时间复杂度的分析方法
- 做了几道leetcode的题目
需要进一步补充的知识
- 需要刷更多的题目