理解贪心算法

贪心算法是一种算法思想,并不是一个具体的算法,因此我们用两个例子来理解什么样的问题适合用贪心算法解决。

例一

现在有一个能装 100g 物品的背包,和一些可拆分的物品(见表格),怎么装才能使背包中物品价值最大?

物品

重量

价值

A

100g

100

B

60g

120

C

50g

150

D

20g

50

容易想到的方法是通过计算物品单价,从高到低往背包中放。

例二

在一个加权有向图中,求 A 到 G 的最短距离。

若依旧使用例一中的方法,则找到的路径是 A->B>D>E>G,明显不是最短的路径。

综述

例一和例二的相同点:

要得到最终的结果,都需要多次决策,

比如例一中每次决策选择一个物品,例二中每次决策选择一条路。

例一和例二的区别:

例一中每次决策都不会影响后续的决策范围,即选择了一个物品后,下次选择范围仍然是所有物品,而例二中,第一次决策选择一条路后,第二次决策的可选项会受到第一次决策的影响。

假设我们给例一增加条件:物品 B 和 D 不能在背包中共存,如此,贪心算法便不可用了,因为当我们在某次决策中选择了物品 B 后,会影响到下一次决策。

贪心算法,就是在每一次决策时,都选择当前最优的选项。

贪心算法练习

钱币找零问题。

人民币有 1 元,5 元,10 元,20 元,50 元,100 元面值的钱,当我们要找零 98 元时,如何凑呢?

通常做法是从面值大的开始凑,即 1 张 50,2 张 20,1 张 5,4 张 1,可以得到 98。

区间覆盖问题

现在有几个区间[6,8],[2,4],[3,5],[1,5],[5,9],[8,0],要求的是两两不相交的区间最多有几个?

解决思路,首先对这些区间排序,以右边值从小到大排序,右边值相同的情况下,按左边值从小到大排序,决策时,候选区间左端点不能与已选择的区间相交。

哈夫曼编码

假设现在有 10000 个字符,均是由a,b,c,d,e,f,g这7个字符构成,每个字符占 8 bit,一共需要占 80000 bit,思考如何压缩呢?

方法一:7 个字符可以使用 3 bit 来表示,因为 3 bit 可以表示 8 个字符

000,001,010,011,100,101,110,111,每个字符用 3 位表示,总大小为 30000 bit。

方法二:哈弗曼编码,统计 10000 个字符中,a,b,c,d,e,f,g的出现频率,频率高的编码少,频率低的编码多。

每个字符的编码都不等长的话,在解码的时候,为了避免出现歧义,字符的编码不能存在前缀关系。

计算哈夫曼编码一般是使用一个优先队列,将每个字符看做一个节点,节点的值是字符的出现频次,每次从队列中取两个节点,组合成一个节点,再入队。

字符

出现的频率

编码

a

45

0

b

13

101

c

12

100

d

16

110

e

9

1111

f

5

1110

以上述方法画出哈夫曼树:

贪心算法哈夫曼编码c语言,贪心算法详解:哈夫曼编码相关推荐

  1. c语言霍夫曼函数,使用C语言详解霍夫曼树数据结构

    1.基本概念 a.路径和路径长度 若在一棵树中存在着一个结点序列 k1,k2,--,kj, 使得 ki是ki+1 的双亲(1<=i 从 k1 到 kj 所经过的分支数称为这两点之间的路径长度,它 ...

  2. 国密算法Go语言实现(详解)(九) ——SM2(椭圆曲线公钥密码算法)

    国密算法Go语言实现(详解)(九) --SM2(椭圆曲线公钥密码算法) 原创代码:https://github.com/ZZMarquis/gm 引用时,请导入原创代码库.本文仅以注释方式详解代码逻辑 ...

  3. c语言排序算法 应用与实现,基于C语言排序算法改进与应用.doc

    基于C语言排序算法改进与应用 基于C语言排序算法改进与应用 摘 要:介绍了程序语言中排序的原理及应用,阐述了基于C语言的三种主要排序方法,提出了每种排序方法的改进,计算出改进后算法的时间复杂度,编写了 ...

  4. 国密算法Go语言实现(详解)(十) ——SM2(椭圆曲线公钥密码算法)

    国密算法Go语言实现(详解)(十) --SM2(椭圆曲线公钥密码算法) 原创代码:https://github.com/ZZMarquis/gm 引用时,请导入原创代码库.本文仅以注释方式详解代码逻辑 ...

  5. js php base64,JavaScript实现Base64编码与解码的代码详解

    本篇文章给大家分享的是jJavaScript实现Base64编码与解码的代码详解,内容挺不错的,希望可以帮助到有需要的朋友 一.加密解密方法使用//1.加密 var str = '124中文内容'; ...

  6. python语言的格式框架_django框架模板语言使用方法详解

    本文实例讲述了django框架模板语言使用方法.分享给大家供大家参考,具体如下: 模板功能 作用:生成html界面内容,模版致力于界面如何显示,而不是程序逻辑.模板不仅仅是一个html文件,还包括了页 ...

  7. python自动解析json_Python语言解析JSON详解

    本文主要向大家介绍了Python语言解析JSON详解,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. JSON 函数使用 JSON 函数需要导入 json 库:import jso ...

  8. c语言4 答案详解,2019考研数据结构C语言版详解答案(4)

    <数据结构(C语言版)>复习重点在二.三.六.七.九.十章,考试内容两大类:概念,算法,自从计算机专业课统考以后,专业课考试题型分为2类,一类选择题,一类综合应用题.本次新东方在线整理了数 ...

  9. 【排序】什么都能排的C语言qsort排序详解【超详细的宝藏级别教程】深度理解qsort排序

    [排序]什么都能排的C语言qsort排序详解[超详细的宝藏级别教程]深度理解qsort排序 作者: @小小Programmer 这是我的主页:@小小Programmer 在食用这篇博客之前,博主在这里 ...

  10. 【C语言】字符变量详解

    [C语言]字符变量详解 作为计算机语言中的一种基本数据类型,字符型数据在编写计算机程序时经常用到.在C语言中,字符型数据是以char类型来表示的.在本篇博客中,我们将对C语言中的字符变量进行详细的讲解 ...

最新文章

  1. GIT如何查看本地分支与远程分支的关联配置(git branch --set-upstream)
  2. 网络推广软件浅谈关键词如何布置才能让优化更事半功倍!
  3. 2015 SegmentFault 黑客马拉松记录
  4. Warning: Unknown: The session id is too long
  5. [转]Global exception handling in Web API 2.1 and NLog
  6. n型半导体和p型半导体的区别_VNX系列大流量工业型膜堆, 为半导体等行业提供超纯水!...
  7. 上午写了一段代码,下午就被开除了,奇怪的知识又增加了
  8. jstl表达式替换某些字符
  9. 第50课 书香阁的座位数
  10. 创业与老子的顺其自然
  11. 春节档影片的成本各是多少?
  12. php ldap ad 登录验证,PHP中的LDAP身份验证 – 无需密码即可进行身份验证
  13. RAID入门一页通,最全的RAID技术、原理图解
  14. 操作教程:摄像头通过GB28181协议注册EasyCVR的详细配置
  15. matlab教程 导入数据,MATLAB数据导入
  16. Carlife Iphone IAP2连接与认证过程
  17. puzzle(1024)帐篷、星之战
  18. python tushare获取股票数据_python调用tushare获取沪股通、深股通成份股数据
  19. 第7讲 替代定理、戴维南定理、诺顿定理
  20. firefox/safari/chrome浏览器模拟iPad的userAgent的方法

热门文章

  1. 前端基础知识:理解 Web Worker
  2. 凸函数1(斯坦福凸优化笔记5)
  3. 【Trex】Trex Tips summary
  4. [VNCTF] insterestingPHP
  5. easyswoole2.X源码解读-Dispatcher
  6. Windows10 关闭右键 WPS扩展功能
  7. vue v-lazy无法加载图片
  8. 前端如何实现微信扫描二维码下载应用,根据手机系统跳转不同页面
  9. 基于FPGA的图像处理1--图像处理基础IP设计
  10. HTML5 完美解决javascript中iphone手机和android手机复制文本到剪切板问题