五大常用算法概念

五大常用算法概念

1. 贪心算法

贪心算法的思想: 在对问题求解时, 总是做出在当前看来最好的选择. 只做出某种意义上的局部最优解.

一般步骤:

  • 建立数学模型
  • 把求解的问题分成若干个子问题
  • 对每一子问题的求解, 得到子问题的局部最优解
  • 把子问题的局部最优解结合起来就是原先问题的解

2. 动态规划算法

动态规划算法与分治算法类似, 都要 将问题分成若干个子问题, 先求解子问题, 然后从这些子问题的解得到原先问题的解. 但是不同的是: 动态规划求解的问题往往不是互相独立的, 具有重复子问题和最有子结构.

应用场景: 使用动态规划的问题必须满足最优化原理, 无后效性和 重叠性

  • 最优化原理(最优子结构): 一个最优化策略的子策略总是最优的. 一个问题满足最优化原理 称其 具有最优子结构性质. 如果可以把局部子问题的解结合起来得到全局最优解, 那这个问题就具有最优子结构.
  • 无后效性: 要求每个子问题的决策不能对后面其他未解决的问题产影响
  • 子问题的重叠性: 如果计算最优解时需要处理很多相同的问题,那么这个问题就具备重复子问题. 动态规划必须保证我们分割成的子问题也能按照相同的方法分割成更小的子问题, 并这些自问题的最终分割情况是可以解决的。其中的关键在于解决冗余,这是动态规划算法的根本目的。动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其它的算法

一般步骤:

  1. 分析最优解的性值, 并刻画其结构特征
  2. 递归的定义最优值
  3. 以自底向上的方式或自顶向下的及优化方法(缓存, 备忘录)计算出最优值
  4. 根据计算最优值时得到的信息, 构建一个最优解

此时,在步骤(3)中**计算最优值时,通常需记录更多的信息,**以便在步骤(4)中,根据所记录的信息,快速地构造出一个最优解。

实际解题过程:

  1. 确定子问题: 分析哪些变量随着问题的规模变小而变小, 哪些变量与问题的规模无关
  2. 确定状态: 根据上边子问题来给分割的子问题限定状态
  3. 推导出状态转移方程: 注意状态转移方程是不是满足所有条件
  4. 确定边界条件:
  5. 确定实现方式:
  6. 确定优化方法: 优化内存, 优化时间

经典问题: 斐波那契数列, 备忘录方法

看一遍就理解:动态规划详解 - 知乎 (zhihu.com)

3. 分治算法

分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。 求出子问题的解,就可得到原问题的解。

应用分直策略解决的问题一般具有一下特点:

  1. 原问题可以分解为多个子问题, 子问题与原问题相比, 只是问题的规模下降, 结构和求解党法与原问题相同或类似
  2. 原问题在分解过程中, 递归地求解子问题. 当分解后的子问题规模足够小时, 应该能够直接求解
  3. 在求解并得到各个子问题的解后应能够采用某种方式, 方法合并构造出原问题的解

一般步骤:

  1. 分解
  2. 求解
  3. 合并

经典问题:归并排序、堆排序、快速排序、二分查找, 全排列问题、整数划分问题、求第k大元素

4. 回溯算法

简单概述(搜索与回溯): 回溯法 = 穷举 + 剪枝

回溯法思路的简单描述就是: 把问题的解空间转化成了图或者树的结构表示, 然后使用深度优先搜索进行遍历, 遍历过程中记录和寻找所有可行解或者最优解. 类同于:

  • 图的深度优先搜索
  • 二叉树的后续遍历
规则
  1. 从根节点触发搜索解空间树, 当算法搜索只解空间树的某一结点时, 利用**剪枝函数** 判断该节点是否可行(即能得到问题的解).
  2. 不可行, 跳过该节点为根的子树的搜索. 逐层向上回溯
  3. 可行的话, 进入该子树, 继续按照深度优先策略搜索
  • 剪枝函数分为两类: 约束函数----减去不满足约束条件的路径; 界限函数----剪去不能得到最优解的路径
  • 问题的关键: 如何定义问题的解空间, 将解空间转化为树

一般步骤:

  1. 针对所有问题, 定义问题的解空间
  2. 确定以用户搜索的解空间结构
  3. 以深度优化方式搜索解空间, 并在搜索过程中用剪枝函数避免无效搜索

经典问题: n皇后, 图的着色问题, 子集,字符串的排列

5. 分支界限算法

回溯算法是深度优先,那么分支限界法就是广度优先. 回溯法一般来说是遍历整个解空间,获取问题的所有解,而分支限界法则是获取一个解(一般来说要获取最优解)

基本思想: 分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解

分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。

在分支限界法中,每一个活结点只有一次机会成为扩展结点活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些子结点中,不可行解或非最优解的子结点被舍弃,其余儿子结点被加入活结点表中。 此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。

一般步骤:
  1. 定义问题的解空间
  2. 确定解空间的结构
  3. 以广度优先方式搜索整个解空间
  4. 找出所要的解(限界函数的使用)
常见的两种分支限界法:
  1. 队列式(FIFO)分支限界法

    队列式分支限界法将活节点表组织成一个队列,并将队列的先进先出原则选取下一个节点为当前扩展节点。

  2. 优先队列式分支限界法

    优先队列式分支限界法将活节点表组织成一个优先队列,并将优先队列中规定的节点优先级选取优先级最高的下一个节点成为当前扩展节点。如果选择这种选择方式,往往将数据排成最大堆或者最小堆来实现。

寻路算法

很多算法在图上运行

广度优先搜索在所有方向上平等地探索。这是一种非常有用的算法,不仅适用于常规路径查找,还适用于程序地图生成、流场寻路、距离图和其他类型的地图分析。

Dijkstra的算法(也称为统一成本搜索)让我们优先考虑要探索的路径。它不是平等地探索所有可能的路径,而是倾向于低成本路径。我们可以分配更低的成本来鼓励在道路上移动,分配更高的成本来避开敌人,等等。当移动成本发生变化时,我们使用它而不是广度优先搜索。

A* 是对 Dijkstra 算法的修改,针对单个目的地进行了优化。Dijkstra的算法可以找到到所有位置的路径;A* 查找指向一个位置或多个位置中最近的路径。它优先考虑似乎更接近目标的路径。
在这里插入图片描述

  • 26
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值