博客
关于我
算法导论-上课笔记7:贪心算法
阅读量:522 次
发布时间:2019-03-07

本文共 1351 字,大约阅读时间需要 4 分钟。

贪心算法

贪心算法是一种通过局部最优选择来求解问题的方法。其核心思想是在每一步做出在当前状态下最看似最佳的选择,期望这些选择能导致全局最优解。贪心算法在许多问题中都有应用,尤其是在活动选择问题和哈夫曼编码中。

活动选择问题

活动选择问题的目标是从给定的多个活动中选择一个最大的互相兼容的子集。活动是资源冲突,且资源只能供一个活动使用。每个活动有确定的开始时间和结束时间。

最优子结构

活动选择问题具有最优子结构性质。设 Sij 表示在活动 ai结束之后开始,且在活动 aj开始之前结束的活动集合。最大兼容活动子集 Aij 包含活动 ai及其子集 AikAkj。根据最优子结构, |Aij| = |Aik| + |Akj| + 1

证明:“如果可以找到 Skj 的一个兼容活动子集 A’kj, 使得 **|A’kj| ≥ |Akj|,则可以将 A’kj 而不是 Akj 作为 Sij 的最优解的一部分。”

< Killer move!> 这一性质使得动态规划算法适用于活动选择问题。

贪心选择

贪心算法在活动选择问题中选择最早结束的活动 a1, 因为它剩下的资源可以供尽量多的活动使用。按结束时间排序后,活动 ai 按自然顺序排列,其它活动只能在其之后开始。

递归贪心算法

递归算法高效处理子问题,选择活动后处理剩余的子问题。伪代码如下:

递归活动选择器(s, f, k, n)    m = k + 1    while m <= n 和 s[m] >= f[k]        返回 {am} ∪ 递归活动选择器(s, f, m, n)    如果没有符合条件的活动,返回空集

迭代贪心算法

将递归算法转换为迭代形式:

贪心活动选择器(s, f)    n = s.length    A = {a1}    k = 1    for m = 2 到 n        如果 s[m] >= f[k]            将 am 加入 A            k = m

哈夫曼编码

哈夫曼编码是一种高效的数据压缩方法,通过构造前缀码优化压缩率。使用满树结构,频率较高的字符代码较短,低频的较长。

前缀码

前缀码保证每个码字不是其他码字的前缀,解码过程只需识别码字开始位置即可解码。

构造哈夫曼树

伪代码如下:

哈夫曼编码器(C, freq)    1. 初始化最小优先队列 Q = C    2. for i = 1 到 n-1 次            提取两个最小频率字符 x 和 y            创建新节点 z,z.freq = x.freq + y.freq            将 z 和 x、y 替换为新节点    3. 返回队列中最后一个节点的编码树

证明正确性

引用引理 D 和 E,证明哈夫曼算法构造最优前缀码。贪心选择替换为低频字符合并,具有最优子结构。

拟阵和贪心算法

拟阵是一种记录哈夫曼树结构的数据结构,便于查找和更新节点信息。尽管不会更新,但可以用于更高效管理哈夫曼树。

用拟阵求解任务调度

类似地,可用拟阵记录活动选择过程中的子问题信息,构建最优解。


希望这篇优化后的文章能够清晰地阐述贪心算法在活动选择问题中的应用及其在哈夫曼编码中的作用。

转载地址:http://vdknz.baihongyu.com/

你可能感兴趣的文章
PostgreSQL 实现批量更新、删除、插入
查看>>
PostgreSQL 导入 .gz 备份文件
查看>>
PostgreSQL 批量插入&更新数据时报错(ERROR: ON CONFLICT DO UPDATE command cannot affect row a second time)
查看>>
PostgreSQL 新增数据返回自增ID
查看>>
postgresql 更新多列数据
查看>>
PostgreSQL 服务启动后停止
查看>>
PostgreSQL 辟谣存在任意代码执行漏洞:消息不实
查看>>
PostgreSQL+PostGIS实现两坐标点之间最短路径查询算法函数(地图工具篇.12)
查看>>
Qt开发——简易调色板QPalette
查看>>
PostgreSQL-解决连接时遇到的乱码问题
查看>>
PostgreSQL15.2最新版本安装_远程连接_Navicat操作_pgAdmin操作_Windows10上安装---PostgreSQL工作笔记001
查看>>
PostgreSQL9.1 双机部署配置(主备数据同步)
查看>>
Qt开发——简易网络浏览器(一)
查看>>
Qt开发——简易成绩登记系统
查看>>
Postgresql中PL/pgSQL代码块的语法与使用-声明与赋值、IF语句、CASE语句、循环语句
查看>>
Postgresql中PL/pgSQL的游标、自定义函数、存储过程的使用
查看>>
SpringBoot中集成XXL-JOB分布式任务调度平台,轻量级、低侵入实现定时任务
查看>>
Postgresql中的表结构和数据同步/数据传输到Mysql
查看>>
Postgresql中自增主键序列的使用以及数据传输时提示:错误:关系“xxx_xx_xx_seq“不存在
查看>>
SpringBoot中集成websocket后WebSocketServer中注入mapper为空
查看>>