贪心算法可视化
贪心每步选择当前最合适的候选,不回头修改。本组把选择与证明一起展示:区间调度选择最早结束者,哈夫曼合并最低频子树,动画都与代码同步。
简短规则不一定正确。“最早开始”“最大价值”“下一步最便宜”都容易写出,关键是证明。交换论证说明如何把某个最优解逐步换成贪心选择,且不降低质量。
各课展示什么
| 课程 | 贪心规则 | 安全依据 | 观察内容 |
|---|---|---|---|
| 区间调度 | 选兼容区间中结束最早者 | 可替换最优解的首个区间,留下不少于原来的空间 | 把另一份最优日程逐步交换成贪心日程 |
| 跳跃游戏 | 按索引维护最远可达边界 | 每次可跳“最多” nums[i],可达集保持连续前缀,断层后无法越过 | 橙色跳跃弧与绿色边界,对照所有路径陷入零的位置 |
| 哈夫曼编码 | 合并频率最低的两棵子树 | 稀有叶子更深的成本较低,常见符号留浅,可建立最优前缀码 | 优先队列构建编码树,实时比特数与定长编码比较 |
| 分数背包 | 按价值密度装入,最后一件可切分 | 切分保留密度,可分时高密度优先最优;不可分时该规则会失败 | 密度矩形与 205/220/240 三个比较值 |
建议学习顺序
- 区间调度:一项资源、一个选择规则,观察交换过程如何不减少区间数。
long-blocker预设展示“最早开始”这个错误规则的失败。 - 跳跃游戏:状态只有一个最远位置。不变量是可达区域保持连续前缀;失败预设只交换一次相同数值的位置,就得到相反结论,说明数组结构同样重要。
- 哈夫曼编码:贪心构建的二叉树就是答案。默认文本使用 23 比特,定长编码用 33;均匀频率预设则持平,没有前缀树能优于每符号两比特。
- 分数背包:检验可分性这个前提。同样的密度规则在可分物品中最优,改为 0/1 选择后就可能输给最优解,内置对照会重放这个失败。
学完这四课,可继续学习图算法中的 Dijkstra 与最小生成树。它们也使用贪心证明,但数据结构和图上的不变量是课程重点。