您的位置:首页 > 其它

算法求解方法与思路的总结

2016-09-06 08:55 295 查看
当算法问题给出时,其实也就相当于给出了函数的输入和输出,也就是整个函数的接口形式。

比如通配符范式与字符串的匹配问题,

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
;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: