开始看书,《你也能看得懂的python算法书》。
编程基础,链表等就略读了。
哈希算法是通过某种函数映射关系,将复杂的数据,映射成更加易于查找的形式。大多数情况下,哈希算法可以在常数时间内存储和查找这些数据。原理:利用哈希函数存储和查找数据。哈希算法存在冲突的情况,即不同的数据被映射到同一个位置。处理冲突的方法:链地址法。本质上是数组+链表。查找问题,首先想想能不能用哈希算法。
搜索问题的本质是试探问题的所有可能选择,按照特定规律和顺序,不断地去搜索答案,直到找到问题的解。有深度优先遍历算法和广度优先遍历算法。
回溯算法,采用试错的方法解决问题,当前步骤失败,返回上一个步骤,选择另一个方案继续试错。
贪心算法,总是选取局部最优的方案,直到获得最终解决。使用该算法,需要问题具有贪心选择性质,是指应用同一规则f,将原问题变为一个相似的但规模更小的子问题,后面的每一步都是当前看似最佳的选择。另外问题需要具有局部最优解。
动态规划算法将待求解问题拆分成一系列相互交叠的子问题,通过递推关系定义各子问题的求解策略,并随时记录子问题的解,最终获得原始问题的解,避免了对交叠子问题的重复求解。
在动态规划算法中有三要素,即最优子结构、边界和状态转移函数。最优子结构是指每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到;边界是指问题最小子集的解;状态转移函数是指从一个阶段向另一个阶段过渡的具体模式,描述的是两个相邻子问题之间的关系。
最短路径算法,有迪可斯特朗算法、Floyd算法、A※算法。
用具体例子来看吧。
回溯算法(参考: https://zhuanlan.zhihu.com/p/93530380)
需要考虑三个问题:路径(已经做出的选择)、选择列表(当前可作的选择)、结束条件(到达决策树底层,无法再做选择的条件)
其框架为:
1 | result = [ ] |
例子:全排列问题。
1 | # coding:utf-8 |
时间复杂度是O(N!),因为需要穷举整棵决策树。
再来看另一个例子,N皇后问题。
跟全排列类似,多了一个判断不合法的位置的函数。
参考:https://www.geeksforgeeks.org/n-queen-problem-backtracking-3/
1 | # N皇后问题 |
再来几个例子,数独问题。
9×9的格子,每行,每列以及每3×3格组成的宫里的数字都不相同。
参考这里:https://zhuanlan.zhihu.com/p/99218941
1 | from datetime import datetime |
现在来看另一个问题,0-1背包问题。
参考这里:https://www.cnblogs.com/xiaomangxie/p/10208441.html
有N件物品和一个容量为V的背包。第i件物品的价格(即体积,下同)是w[i],价值是c[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
回溯法解决看这里:http://www.jeepxie.net/article/273672.html
1 | # 背包问题 |
本章代码: https://github.com/zwdnet/MyQuant/blob/master/43/backtrace.py
我发文章的三个地方,欢迎大家在朋友圈等地方分享,欢迎点“在看”。
我的个人博客地址:https://zwdnet.github.io
我的知乎文章地址: https://www.zhihu.com/people/zhao-you-min/posts
我的微信个人订阅号:赵瑜敏的口腔医学学习园地