关于五大常用算法,来自随遇而安随缘一世的http://blog.csdn.net/lcj_cjfykx/article/details/41691787,值得大概了解。
贪心算法:在对问题求解时,总是做出在当前看来是最好的选择,有可能陷入局部最优。
分治:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
动态规划:将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。与分治的区别:经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。
回溯:在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。
分支限界:采用广度优先的策略,在问题的解空间树T上搜索问题解。与回溯区别:回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。
例题绘画展览门票每张5元,如果有2n个人排队购票,每人一张,并且其中一半人恰有5元钱,另一半人恰有10元钱,而票房无零钱 可找,那么如何将这2n个人排成一列,顺次购票,使得不至于因票房无零钱可找而耽误时间,应该采用什么算法解决呢?()
题意为排队购票,大的调整肯定不行,否则我直接喊所有5块的站前边,10块的站后边,排队的人肯定不乐意。
所以,必须依着本来的排队顺序,一步一步走,即从根结点出发,一步一步判断。就是分支限界的FIFO搜索:将活节点表组织成一个 队列,并将队列的先进先出原则,选取下一个节点为当前扩展节点。