算法第四章作业
给定n个闭区间[ai, bi],需要选择尽可能少的点,使得每个区间内都至少包含一个点。
经过分析,我采用了基于区间右端点排序的贪心策略:
排序:将所有区间按照右端点bi进行升序排序
选择点:从第一个区间开始,选择当前区间的右端点作为第一个点
跳过覆盖:检查后续区间,如果该区间包含已选择的点(即ai ≤ 当前选择点),则跳过
新增点:遇到第一个不被当前点覆盖的区间时,选择该区间的右端点作为新点
重复:重复步骤3-4直到处理完所有区间
定理证明
贪心选择性质:存在一个最优解,其中第一个点选在右端点最小的区间的右端点。
证明:
设所有区间按右端点排序后为:I₁, I₂, ..., Iₙ
设I₁是右端点最小的区间,即b₁ = min{bᵢ}
假设存在一个最优解S,其中第一个点p不在I₁的右端点
考虑两种情况:
如果p在I₁内部:那么用b₁替换p,仍然覆盖所有原来被p覆盖的区间
如果p不在I₁内部:那么I₁不被任何点覆盖,矛盾
因此,总存在一个最优解以b₁作为第一个点
最优子结构性质证明
设选择了第一个点p = b₁后,剩余需要覆盖的区间集合为R
原问题的最优解 = {p} ∪ R的最优解
这是因为p的选择不影响剩余区间的选择,具有独立性
三、时间复杂度分析
时间复杂度
排序阶段:O(n log n),使用快速排序或归并排序
遍历阶段:O(n),线性扫描所有区间
总时间复杂度:O(n log n)
空间复杂度
存储区间:O(n)
额外空间:O(1)(如果不计排序所需的栈空间)
对贪心算法的理解
-
贪心算法的本质
贪心算法是一种局部最优导致全局最优的算法思想。它在每一步都做出当前看起来最优的选择,希望这样的局部最优选择能够导致全局最优解。 -
贪心算法的适用条件
使用贪心算法需要满足两个关键性质:
贪心选择性质:可以通过局部最优选择构建全局最优解
最优子结构:问题的最优解包含子问题的最优解
- 贪心算法的优缺点
优点:
实现简单,代码简洁
通常具有较高的效率
容易理解和调试
缺点:
不是所有问题都适用
需要严格的数学证明
可能得到次优解而非最优解
浙公网安备 33010602011771号