算法求解方法与思路的总结
2016-09-06 08:55
295 查看
当算法问题给出时,其实也就相当于给出了函数的输入和输出,也就是整个函数的接口形式。
比如通配符范式与字符串的匹配问题,
一些特殊情况一定要考虑周全(if, if, if),不重不漏;
穷举 + 动态规划:
先利用穷举搜索法编写出检索所有答案的函数,然后利用制表的方法把算法变换成动态规划算法。
N! ,仅适用于 N 不超过 10 的场景,11!=39916800;
生成所有组合(combination):C++组合数(combination)的实现
生成 2n
比如著名的 0/1 背包算法,当然时间复杂度会增加地十分迅速,并不是第一选择,仅提供一种理论上的可能性;
f(n)=f(n/2)+n2n2f(n/2)
二项式系数
二等分(简单粗暴,横竖就是中间一刀)
f(n) ⇔ f(n/2)
对于有关一维问题(n)的情况,
分治:n ⇒ n/2
动态规划(常常伴随递归):n ⇒ n-1
对于有关二维问题((n,s))的情况,
动态规划(递归):(n−?,s−1) 或者 (n−1,s−?)
对于动态规划(常常伴随递归)问题的规模总是在不断减小,也即变成规模更小的子问题(subproblems),当然对于动态规划而言,子问题之间存在大量的重复计算,规模更小的子问题,具有相似的求解结构;
比如通配符范式与字符串的匹配问题,
bool match(const string& patterns, const string& str);
一些特殊情况一定要考虑周全(if, if, if),不重不漏;
穷举 + 动态规划:
先利用穷举搜索法编写出检索所有答案的函数,然后利用制表的方法把算法变换成动态规划算法。
1. 穷举搜索
生成所有排列(permutation)N! ,仅适用于 N 不超过 10 的场景,11!=39916800;
生成所有组合(combination):C++组合数(combination)的实现
生成 2n
比如著名的 0/1 背包算法,当然时间复杂度会增加地十分迅速,并不是第一选择,仅提供一种理论上的可能性;
2. 分治:一刀两断
所谓一刀两断,将原始(针对于 n 的)问题,从中间横竖一切,求 f(n) 与 f(n/2) 之间的数学关系,比如著名的 1+2+…+n,则可知:f(n)=f(n/2)+n2n2f(n/2)
3. 动态规划
斐波那契二项式系数
4. 问题规模约简(deduction)的策略
以每个数字为单位分割 f(n) ⇔ f(n-1)二等分(简单粗暴,横竖就是中间一刀)
f(n) ⇔ f(n/2)
对于有关一维问题(n)的情况,
分治:n ⇒ n/2
动态规划(常常伴随递归):n ⇒ n-1
对于有关二维问题((n,s))的情况,
动态规划(递归):(n−?,s−1) 或者 (n−1,s−?)
对于动态规划(常常伴随递归)问题的规模总是在不断减小,也即变成规模更小的子问题(subproblems),当然对于动态规划而言,子问题之间存在大量的重复计算,规模更小的子问题,具有相似的求解结构;
5. 旅行商问题
维护结点(城市)是否被访问过;bool visited ;
相关文章推荐
- Android官方开发文档Training系列课程中文版:性能优化建议
- ScrollView嵌套ViewPager问题解决方案
- Snoopy
- Oracle EBS上传Form编译
- SVN 代码版本管理软件
- iOS狂暴之路(开始篇)---学习路线总结
- Android中播放本地SD卡中歌曲需要的添加的权限
- 写给那些常年战痘的痘友们~~~
- 关于JDBC导入mysql的jar驱动的头痛
- HTTP协议详解
- 使用 STL 辅助解决算法问题
- http协议
- 嗯~有意思的Dialog动画
- 最新最好的八款渗透测试工具
- 微信硬件H5面板开发(二) ---- 实现一个灯的控制
- Hibernate框架开发笔记 lesson5
- 三国杀全武将台词大全(标准+神话再临+一将成名12345+SP+国战+其他+皮肤,更新中)
- 信息采集
- 记录-新建一个web应用的过程与曲折
- 短信拦截马”黑色产业链与溯源取证研究