课程来源
极客时间——数据结构与算法之美(王争)
概述
数据结构:一组数据的存储结构
算法:操作数据的一组方法
数据结构为算法的服务,算法要作用在特定的数据结构上
复杂度分析:算法时间和资源效率的考量,很重要
课程内容总览:
10个数据结构:数组,链表,栈、队列、散列表、二叉树、堆、跳表、图、Trie数
10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法
复杂度分析
事后统计法的缺点:1.测试结果依赖测试环境;2.测试结果受数据规模影响大
复杂度计算过程:
假设每行代码执行时间都是unit_time,统计所有代码执行的次数,再取数量级即可
所有代码的执行时间T(n)与每行代码的执行次数n成正比,即下列公式
T(n)=O( f(n) )
大O时间复杂度表示法:
表示代码执行时间随数据规模增长的变化趋势,也叫渐进时间复杂度(asymptotic time complexity,简称时间复杂度)
如何分析代码的时间复杂度:
1.只关注循环执行次数最多的一段代码
2.加法法则,总复杂度等于量级最大的那段代码的复杂度
3.乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度乘积
常见复杂度量级
其中:只有O(2^n)和 O(n!)是非多项式量级
NP问题:时间复杂度为非多项式量级的算法问题(Non-Deterministic Polynomial,非确定多项式)
O(1)
算法中不存在循环、递归语句,其复杂度即O(1)
O(logn)、O(nlogn)
logn的底数不一定是2,因为任何数为底的对数,都可以通过分离常量来变成C*log2(n)的形式
nlogn就是将O(logn)的代码执行n次的算法,如归并排序,快速排序的时间复杂度都是O(nlogn)
i=1;
while (i <= n) {
i = i * 2;
}
i=1;
while (i <= n) {
i = i * 3;
}
O(m+n)、O(m*n)
当无法判断2个循环的规模,哪一个比较大时,加法规则(max的那个规则)就失效,但是乘法规则仍然适用
int cal(int m, int n) {
int sum_1 = 0;
int i = 1;
for