【本文又名:小仙女讲软考之算法设计和分析】
小仙女课堂开课啦,算法设计总学不好?多半是没理解透基本概念,看小仙女牌博客就好啦。
分治法——分而治之,各个突破
现实导入:
想想秦始皇是怎么统一六国的?“远交近攻,各个击破”。
对喽,先集中兵力打一个国家,成功后再攻击另一个。这便体现了分治的思想。
先打近的,再打远的,如果先打远的再打近的,会激起各国联合抗秦的斗志。所以,如果攻不下近的国家,远的国家也打不成,这体现了递归思想。
why?
原问题太大,太复杂,分开来看会容易些。
how?
分——治——合
what?
.归并排序:
先在各小组内排,再扩大小组
.最大子段和问题:
在8745319序列中找出含有3个元素的最大子段和?最大子段为874,其和为19
在一个给出序列中找出含有N个数字的连续字段,条件是其和最大。
.汉诺塔问题:
假设共有10个盘子,先借助C,把前9个盘子放到B上;然后再将第10个盘子放到C上;最后借助A,将B上的9个盘子放到C上。
动态规划法——拿最利于自己的东西
现实引入:
小偷去超市偷东西,假如已经将背包装满,准备离开时看到门口有块黄金可以偷,那他偷还是不偷?
有人说不偷,那如果他的背包里放着些吃的,把吃的拿出来,把黄金放进去,岂不是更好?
有人说偷,那如果他的背包里是价值更大的钻石呢?如果换了岂不是愚蠢。
在偷与不偷的思考过程中,就进行了一次动态规划的演算。
why?
最优子结构;重叠子问题
how?
定义什么是最优解——先假定已持有最优解——考虑是否采用面前东西
what?
.0-1背包问题:
放还是不放,is a question
.最长公共子序列(LCS):
12345和45679,求其LCS?45
贪心法——先吃了最优的
现实引入:
饿汉子问题。当你特别饿的时候,是见着啥吃啥还是等着挑个最美味的?
why?
最优子结构;贪心选择性质
how?
仅根据当前已有的信息作出选择,且一旦作出选择就不再改变。就像你吃下去了就没办法再吐出来了。
what?
.活动选择问题(这个问题本仙女不懂,待我回天上后再仔细思考一下)
.背包问题 可以按“最小重量先放”、“最大价值先放”等原则,将东西放入背包
回溯法——深度优先查找
现实引入:
让你去一块玉米地,只可前进或后退,最终要找到其中最大个的玉米,你怎么做?
往前走的过程中,发现还是刚才碰到的那个大,再往后退去找它。这个往后退的过程就是“回溯”
why?
及时“剪枝”,能避免大量无谓的搜索。
how?
定义解空间——确定易于搜索的解空间结构——以深度优先的方式搜索解空间
what?
.0-1背包问题
.n皇后问题
小结:
本仙女这次下凡只是说说这些算法的基本概念,至于对各方法的比较和其在代码中是怎么具体实现的,请听以后的以后分解。
一家之言,姑妄论之。如果读者有什么想法可以交流,就再好不过啦~