贪心算法
回溯算法
分治算法
动态规划

四种基本的算法思想:贪心算法,分治算法,回溯算法,动态规划,他们不是具体算法,常用来指导我们设计具体的算法和编码等。

一:贪心算法有很多经典应用

霍夫曼编码(Huffman Coding),Prim和Kruskal最小生成数算法,Dijkstra单源最短路径算法。

二:如何理解“贪心算法”

假设我们有一个可容纳100kg物品的背包,可以装下各种物品,我们有以下5中豆子,每种豆子的总量和总价值都各不相同。为了让背包中所装物品的总价最大,该如何?

第一步:当我们看到这类问题时,首先要联想到贪心算法:针对一组数据,定义了限制值和期望值,系统从中选出几个数据,在满足限制值的情况下,期望值最大。
第二步:尝试看这个问题是否可以用贪心算法解决:每次选择当前情况下,在对限制值同等贡献量的情况下,对期望值贡献最大的数据
第三步:举几个例子看下贪心算法产生的结果是否最优的。大部分情况下,举几个例子验证一下就可以了。严格的证明贪心算法的正确性,非常复杂,需要涉及较多的数学推理。并且,从实践的角度来说,大部分能用贪心算法的问题,贪心算法的正确性都是显而易见的,月不需要严格的数学推导证明。

贪心算法,专注于当下最优,但可能无法取得全局最优。

贪心算法实战分析

一:分糖果

有m个糖果和n个孩子,但m<n,所以糖果只能分配给一部分孩子。
每个糖果的大小不等,分为s1,s2……sm。除此之外,每个孩子对糖果大小的需求也是不一样的,只有糖果的大小>=孩子对糖果大小的需求分别是g1,g2,g3……gn。
如何分配才可能满足最多数量的孩子?

可将这个问题抽象成:从n个孩子中抽取一部分孩子分配糖果,让满足的孩子个数(期望值)是最大的。这个问题的限制值就是糖果个数m。

对于一个孩子而言,如果小的糖果可以满足,我们就没必要用更大的糖果,这样更大的就可以留给其他对糖果大小需求更大的孩子。另一方面,对糖果大小需求小的孩子更容易被满足,所以,我们可以从需求小的孩子开始分配他糖果。因为满足一个需求大的孩子跟满足一个需求小的孩子,对我们期望值贡献是一样的。

二:钱币找零(部分题目不适用 100 99 1 找396 )

假设有1元,2元,5元,10元,50元,100元这些面额的纸币,他们的张数分别是c1,c2,c5,c10,c20,c50,c100。我们要有支付k元,最少要用多少张纸币呢?

在贡献相同期望值(纸币数目)的情况下,我们希望多贡献点金额,这样就可以让纸币数更少。这就是一种贪心算法的解决思路。

三:区间覆盖

假设有n个区间,区间的起始端点和结束端点分分别是[l1,r1],[l2,r2],[l3,r3]……,从n个区间中选出一部分区间,这部分区间满足两两不相交(端点相交的情况不算相交),最多能选出多少个区间?

我们假设这 n 个区间中最左端点是 lmin,最右端点是 rmax。这个问题就相当于,我们选择几个不相交的区间,从左到右将[lmin, rmax]覆盖上。我们按照起始端点从小到大的顺序对这 n 个区间排序。
我们每次选择的时候,左端点跟前面的已经覆盖的区间不重合的,右端点又尽量小的,这样可以让剩下的未覆盖区间尽可能的大,就可以放置更多的区间。这实际上就是一种贪心的选择方法。

四:如何用贪心算法实现霍夫曼编码?

假设有一个包含1000个字符的文件,每个字符占1个byte(1byte=8bits),存储这1000个字符就一共需要8000bits。
但使用霍夫曼编码,可实现压缩率在20%~90%之间。
霍夫曼编码不仅会考察文本汇总有多少个不同字符,还会考察每个字符出现的频率,根据频率的不同,选择不同长度的编码。霍夫曼编码试图用这种不等长的编码方法,来进一步增加压缩的效率。
根据贪心的思想,可以把出现频率比较多的字符,用稍微短一些的编码;出现频率比较少的字符,用稍微长一些的编码。
由于霍夫曼编码是不等长的,每次应该读取1为还是2位,3位等来解压缩是个问题,这个问题导致霍夫曼编码解压缩比较复杂。
为了避免解压缩过程中的歧义,霍夫曼编码要求各个字符的编码之间,不会出现某个编码是另一个编码前缀的情况。

假设这6个字符出现的频率从高到低依次是a,b,c,d,e,f。我们把它们编码下面这个样子,任何一个字符的编码都不是另一个的前缀,在解压缩的时候,我们每次会读取尽可能长的可解压缩的二进制,所以在解压缩的时候也不歧义。

根据字符出现频率的不同,给不同的字符进行不同长度的编码的实现方式
把每个字符看作一个节点,并且辅带着把频率放到优先级队列中。从队列中取出频率最小的两个节点A,B,然后新建一个节点C,把频率设置为两个节点的频率之和,并把这个新节点C作为节点A,B的父节点。最后再把C节点放入到优先级队列中。重复这个过程,直到队列中没有数据。

給每一条边画上一个权值,指向左子节点的边,我们统统标记为0,指向右子节点的边,我们统统标记为1,那从根节点到叶节点的路径就是叶节点对应字符的霍夫曼编码

笔记整理来源: 王争 数据结构与算法之美

【数据结构与算法】【算法思想】贪心算法相关推荐

  1. 数据结构与算法之美(十四)算法思想——贪心算法

    目录 贪心算法介绍 贪心算法例子 1. 背包 2. 分糖果 3. 钱币找零 4. 区间覆盖 5. 区间覆盖的延伸:任务调度.教师排课 贪心算法经典应用 1. 霍夫曼编码 2. 最小生成树算法 3. 最 ...

  2. 野生前端的数据结构练习(12)贪心算法

    参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/GreedyAlogrithm 一.贪心算法 贪心算法属于比较简单的 ...

  3. 【算法学习】贪心算法

    参考算导第三版第16章 贪心算法 文章目录 1. 活动选择问题 1.1 活动选择问题的最优子结构 1.2 贪心选择 1.3 递归贪心算法 1.4 迭代贪心算法 2. 贪心算法原理 2.1 贪心选择性质 ...

  4. python贪心算法最短路径_贪心算法---最短路径问题

    一,贪心算法的设计思想 • 从问题的某一个初始解出发逐步逼近给定的目标,每一步都作一个不可回溯的决策,尽可能地求得最好的解.当达到某算法中的某一步不需要再继续前进时,算法停止. 二,贪心算法的基本性质 ...

  5. 分治算法,动态规划算法和贪心算法的区别和联系

    分治算法,动态规划算法和贪心算法的区别和联系 (一)分治算法 分治算法为什么叫分治算法? 分治这个名字可以分成两部: 第一部分是分,表示把一个原问题分解成很多个小问题,逐个解决; 第二部分是治, 表示 ...

  6. 【算法专题】贪心算法的介绍及使用场景

    文章目录 一.什么是贪心算法 二.贪心算法的应用场景 2.1 分糖果 2.2 找零钱 2.3 区间覆盖 三.贪心算法的使用总结

  7. 三大算法之三:贪心算法及其例题详解

    目录 零.前言 1.区分贪心算法和动态规划 1.动态规划 2.贪心算法 3.共通点 2.贪心算法得到最优解的条件 1.具有优化子结构 2.具有贪心选择性 3.任务安排问题 1.问题定义 2.优化子结构 ...

  8. 程序员都会的五大算法之三(贪心算法),恶补恶补恶补!!!

    前言 点击查看算法介绍 五大算法 分治算法 动态规划 贪心算法 回溯算法 分支限界算法 WX搜素"Java长征记"对这些算法也有详细介绍. 贪心算法 一.算法概述 贪心算法也叫贪婪 ...

  9. python贪心算法最短路径_贪心算法2-单源最短路径

    1.问题分析 给定有向带权图G = (V, E),其中每条边的权是非负实数.此外,给定V中的一个顶点u,称为源点.现在要计算从源到所有其它各顶点的最短路径,这里的路径指的是路径上各边的权值之和. 求单 ...

  10. 求一个任意实数c的算术平方根g的算法设计思想_算法复习第四篇——贪心法

    公元2020年5月5日,距离算法考试仅剩4天. 一.知识归纳 1.设计思想 只根据当前已有的信息就做出选择,而且一旦做出了选择,将来无论如何都不能更改 不从整体最优考虑,所做的选择只是在某种意义上的局 ...

最新文章

  1. 使用Fiddler抓取手机HTTP流量包
  2. git 添加外部项目地址
  3. 解决Android Stadio 导入Android 项目,没有可运行的Module
  4. 很好看的加载跳转网站源码
  5. 112_Power Pivot 销售订单按 sku 订单类型特殊分类及占比相关
  6. 一套代码小程序WebNative运行的探索03——处理模板及属性
  7. 更新学生的成绩C语言,学生成绩管理系统C语言代码实现.pdf
  8. jmeter 压测之动态数据关联
  9. 计算机二级电子表格开根号函数,excel公式中开根号是哪一个函数-excel开根公式,excel的根号计算公式...
  10. Deepfool阅读笔记
  11. curl encode
  12. 7-1 厘米换算英尺英寸*宅家第一天
  13. 树莓派CM4封装AD底座使用分享
  14. mysql数据库空间不足_mysql空间不足怎么解决?
  15. 苹果笔记本接移动硬盘怎么使用
  16. SQL中modify和alter用法区别
  17. 【happyz】数字信号处理MATLAB学习-代码整理01
  18. 用计算机弹Despacit,《计算器:游戏》老师,这真的只是个长得好看的计算器而已!...
  19. python存储数据的操作(csv格式文件,Excel表格文件)!!!
  20. 旅行家问题2(TSP,奇怪的转化模型)

热门文章

  1. iOS---------- MBProgressHUD (1.0.0)的变动
  2. C#对用户密码使用MD5加密与解密
  3. 关于多条id相同,只取其中一条记录的sql语句
  4. TreeTemplate树模板
  5. bootstrap综合大作业_齐齐哈尔市克东县城市管理综合执法局昼夜奋战清冰雪,全力以赴保畅通...
  6. JDK源码学习路线~每天学一点~每天进步一点点
  7. 1、jeecg 笔记开篇
  8. Unable to delete directory: D:\Downloads\githubdownfive\tianxmyapp\library\
  9. 辽宁交通职业技术学校计算机好不好,辽宁省交通高等专科学校信息工程系
  10. 记一次生产频繁出现 Full GC 的 GC日志定位