计算机算法分析与设计(基本算法框架)

一、分治法

  1. 将一个大的问题分解成若干个小问题
  2. 对各个小问题逐一击破
  3. 将子问题的解决结果合并,得到问题的解

例子
合并排序
棋盘覆盖问题
循环赛日程表

二、分枝限界法(广度优先搜索)

  1. 从根节点开始节点扩展
  2. 每一个活节点都有一次节点扩展的机会(扩展的节点会一次性将所有的子节点扩展)
  3. 在扩展的子节点中,删除所有不可行和非最优解的儿子节点,其它的节点加入活结点的列表
  4. 反复的扩展列表中的活结点,进行筛选
  5. 直到找到所有的解为止或活结点列表为空为止

例子
0-1背包问题
旅行售货员问题

三、回溯法(深度优先搜索)

  1. 从根节点开始,不断的进行深度优先遍历
  2. 当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,
  3. 直到找到最优解为止

例子
0-1背包问题
旅行售货员问题

四、贪心算法

  1. 建立数学模型来描述问题。
  2. 把求解的问题分成若干个子问题。
  3. 对每一子问题求解,得到子问题的局部最优解。
  4. 把子问题的解局部最优解合成原来解问题的一个解。

例子
0-1背包问题
旅行商问题

五、 动态规划

  1. 求一个问题的最优解
  2. 大问题可以分解为子问题,子问题还有重叠的更小的子问题
  3. 整体问题最优解取决于子问题的最优解(状态转移方程)
  4. 从上往下分析问题,从下往上解决问题
  5. 讨论底层的边界问题

例子
0-1背包问题
旅行商问题

六、 暴力法

  1. 确定求解枚举的变量及范围
  2. 设置循环求出所有情形的解
  3. 在问题的约束要求下求出合理的解

七、最小生成树算法

1. 普里姆算法
已选顶点所关联的未选边中找出权重最小的边,并且生成树不存在环。其中,已选顶点是构成最小生成树的结点,未选边是不属于生成树中的边。

2. 克鲁斯卡尔算法
(1)将边按权值从小到大的顺序添加到新图中,保证添加的过程中不会形成环
(2)重复上一步直到连接所有顶点,此时就生成了最小生成树。这是一种贪心策略。

将图中所有边按照权重的大小 从小到大一个一个按顺序组合成最小生成树,在组合过程新加入的边会导致生成树形成环,那这条边就舍弃,直到所有顶点都添加到生成树中为止。
普里姆算法和克鲁斯卡尔算法详细图解.

发布了122 篇原创文章 · 获赞 221 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/jjsjsjjdj/article/details/103807863