一、贪心算法
只根据当前情况做出最好的选择,其最终结果可能不是最优解,也可以得到最优解的近似解。
贪心算法遵循的两个原则:
1、一旦做出选择,不可以后悔。
2、最终结果可能不是最优解
二、分治法
将一个大问题分解成一个个小的问题,从上到下一层层解决,最后再进行合并,得到的结果就是最终我们想要的结果,快速排序是运用分治法的典型,当数据量达到10^6后,使用快速排序只需要39毫秒,而使用冒泡排序则需要549432毫秒,超过9个小时!
三、动态规划
动态规划和分治法类似,最大的区别是分治法是自上而下的,而动态规划法是自下而上的,举个例子,皇帝统治一个中央帝国,皇帝只有一个人如何统治一个偌大的帝国?皇帝先把整个国家分成一个个郡,郡分为县,县分为镇,镇分为乡,乡分为村,村分为户,这样从乡长往上逐级汇报,最终汇总到皇帝这里,皇帝就掌握了全国的基本信息。
四、回溯法
回溯法本质上是一种深度优先算法,如同一个人走迷宫,每到一个路口做一个标记,选择一条路走下去,发现走不通后再返回到这个路口,再选择另一条路走下去,知道走出迷宫为止。
五、分支限界法
1 算法原理:
分支限界法(branch and bound method)按广度优先策略搜索问题的解空间树,在搜索过程中,对待处理的节点根据限界函数估算目标函数的可能取值,从中选取使目标函数取得极值(极大或极小)的结点优先进行广度优先搜索,从而不断调整搜索方向,尽快找到问题的解。分支限界法适合求解最优化问题。
1.1 分支限界法与回溯法:
- 求解目标:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。
- 搜索方式的不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。
2.1分支限界法思想:
分支限界法首先要确定一个合理的限界函数(bound funciton),并根据限界函数确定目标函数的界[down ,up],按照广度优先策略搜索问题的解空间树,在分直结点上依次扩展该结点的孩子结点,分别估算孩子结点的目标函数可能值,如果某孩子结点的目标函数可能超出目标函数的界,则将其丢弃;否则将其加入待处理结点表(简称PT表),依次从表PT中选取使目标函数取得极值的结点成为当前扩展结点,重复上述过程,直到得到最优解。
2.2 常见的两种分支限界法: - 队列式(FIFO)分支限界法 按照队列先进先出(FIFO)原则选取下一个结点为扩展结点。
- 优先队列式分支限界法 按照优先队列中规定的优先级选取优先级最高的结点成为当前扩展结点。
代码地址:https://github.com/FishLiuWei/Fish-Store/tree/master/CalculateDemo