五大常用算法

五大常用算法思想

前言

据说有人归纳了计算机的五大常用算法,它们是贪婪算法,动态规划算法,分治算法,回溯算法以及分支限界算法。这五个算法是有很多应用场景的,最优化问题大多可以利用这些算法解决。算法的本质就是解决问题。当数据量比较小时,其实根本就不需要什么算法,写一些for循环完全就可以很快速的搞定了,但是当数据量比较大,场景比较复杂的时候,算法就尤为重要了,本文先归纳这几个算法及应用场景,随后在细细品味。

穷举法

1.定义

穷举法也叫枚举法, 在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这结论是可靠的,这种归纳方法叫做枚举法。枚举法是利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,因此枚举法是通过牺牲时间来换取答案的全面性 。穷举法属于暴力破解法, 暴力破解法,就是把所有条件,相关情况统统考虑进去,让计算机进行检索,指导得出与之所有条件符合的结果 。

2.基本思想
  1. 确定枚举对象、枚举范围和判定条件
  2. 枚举可能的解,验证是否是问题的解
3.应用实例
  1. 百钱买鸡问题
  2. 鸡兔同笼问题
  3. 搬砖块问题
  4. 猜数字
  5. 韩信点兵

贪婪算法

1.定义

贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。贪婪算法所得到的结果往往不是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。

2.基本思想
  1. 建立数学模型来描述问题

  2. 把求解的问题分成若干个子问题

  3. 对每一子问题求解,得到子问题的局部最优解

  4. 把子问题对应的局部最优解合成原来整个问题的一个近似最优解

3.应用实例
  1. 钱币找零问题
  2. 区间调度问题
  3. 背包问题
  4. 均分纸牌
  5. 最大整数

动态规划

1.定义

动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。

2.基本思想
  1. 将待求解的问题分解为若干个子问题(阶段)
  2. 按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息
  3. 在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解
  4. 依次解决各子问题,最后一个子问题就是初始问题的解。
3.应用实例
  1. 数字三角形问题
  2. 找零钱问题
  3. 走方格问题
  4. 最长公共序列数

分治算法

1.定义

分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。

2.基本思想
  1. 先把问题分解成几个子问题
  2. 求出这几个子问题的解法
  3. 再找到合适的方法,把它们组合成求整个问题的解法。
  4. 如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题
  5. 以此类推,直至可以直接求出解为止
3.应用实例
  1. 找出伪币
  2. 二分搜索
  3. 汉诺塔
  4. 归并排序
  5. 快速排序
  6. 大整数乘法

回溯算法

1.定义

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。

2.基本思想

从一条路往前走,能进则进,不能进则退回来,换一条路再试

3.应用实例
  1. 八皇后问题
  2. 图的着色问题
  3. 装载问题
  4. 批处理作业调度问题
  5. 背包问题
  6. 最大团问题

分支限界算法

1.定义

分支限界算法是按照广度优先的方式对解空间树(状态空间树)进行搜索,从而求得最优解的算法。

2.基本思想

在搜索的过程中,采用限界函数(bound function)估算所有子节点的目标函数的可能取值,从而选择使目标函数取极值(极大值或者极小值)的节点作为扩展结点(如果限界值没有超过目前的最优解,则剪枝)进行下一步搜索(重复 BFS -> 计算所有子节点限界 -> 选择最优子节点作为扩展结点的过程),从而不断调整搜索的方向,尽快找到问题的最优解。分支限界的思想类似于:图的广度优先搜索,树的层序遍历。

3.应用实例
  1. 单源最短路径问题
  2. 装载问题
  3. 布线问题
  4. 0-1背包问题
  5. 最大团问题
  6. 旅行售货员问题

总结说明

对于一个应用实例可能会有多种算法解决,算法是一种解决问题的思想,任意一个算法绝对不是一两篇文章可以讲清楚的。当然也不是通过一两道题目可以完全学会。学习算法的关键是用算法的思想去想问题,去解决实际问题,多刷题是养成算法思维解决问题的基础。

学习算法方法

1.书籍
  1. 数据结构
  2. 数据结构与算法分析
  3. 算法导论
2.刷题
  1. 牛客
  2. LeeCode
3.在线视频课程
  1. 慕课
  2. 网易云课程(强烈推荐)
4.可视化工具
  • visualgo 网址

最重要的是耐心,自律,有毅力,坚持。

作为才入门的程序员,我已经沉浸在知识海洋中无法自拔,深深感受到了自己的渺小。

你可能感兴趣的:(数据结构与算法)