指示图
算法复杂度
1.时间复杂度
含义: 执行当前算法所消耗的时间
[大O符号表示法 ],即 T(n) = O(f(n))。
其中 n 表示数据规模 ,O(f(n))表示运行算法所需要执行的指令数,和f(n)成正比。
常数阶O(1) :无论代码执行了多少行,其他区域不会影响到操作
线性阶O(n):for循环里面的代码会执行 n 遍,因此它消耗的时间是随着 n 的变化而变化的
平方阶O(n²):当存在双重循环的时候,即把 O(n) 的代码再嵌套循环一遍
对数阶O(logn):在二分查找法的代码中,通过while循环,成 2 倍数的缩减搜索范围,也就是说需要经过 log2^n 次即可跳出循环
线性对数阶O(nlogn):将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logn)
2.空间复杂度
含义:执行当前算法需要占用多少内存空间
算法
1.贪心算法
- 描述:大事化小,小事化了。对于一个较大的问题,通过找到与子问题的重叠,把复杂的问题划分为多个小问题。并且对于每个子问题的解进行选择,找出最优值,进行处理,再找出最优值,再处理。也就是说贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望得到结果是最好或最优的算法。
- 流程:(1)建立数学模型来描述问题。
(2)把求解的问题分成若干个子问题。
(3)对每一子问题求解,得到子问题的局部最优解。
(4)把子问题的局部最优解合成原来问题的一个解。
示例:小明手中有 1,5,10,50,100 五种面额的纸币,每种纸币对应张数分别为 5,2,2,3,5 张。若小明需要支付 456 元,则需要多少张纸币? - 解析:
(1)建立数学模型
设小明每次选择纸币面额为 Xi ,需要的纸币张数为 n 张,剩余待支付金额为 V ,则有:
X1 + X2 + … + Xn = 456.
(2)问题拆分为子问题
小明选择纸币进行支付的过程,可以划分为n个子问题:即每个子问题对应为:在未超过456的前提下,在剩余的纸币中选择一张纸币。
(3)制定贪心策略,求解子问题
制定的贪心策略为:在允许的条件下选择面额最大的纸币。则整个求解过程如下:
选取面值为 100 的纸币,则 X1 = 100, V = 456 – 100 = 356;
继续选取面值为 100 的纸币,则 X2 = 100, V = 356 – 100 = 256;
继续选取面值为 100 的纸币,则 X3 = 100, V = 256 – 100 = 156;
继续选取面值为 100 的纸币,则 X4 = 100, V = 156 – 100 = 56;
选取面值为 50 的纸币,则 X5 = 50, V = 56 – 50 = 6;
选取面值为 5 的纸币,则 X6 = 5, V = 6 – 5 = 1;
选取面值为 1 的纸币,则 X7 = 1, V = 1 – 1 = 0;求解结束
(4)将所有解元素合并为原问题的解
小明需要支付的纸币张数为 7 张,其中面值 100 元的 4 张,50 元 1 张,5 元 1 张,1 元 1 张。 - 心得:贪心算法在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。