趣味算法-04-跟着作者读《趣味算法(第2版)》-贪心算法

简介: 本文是系列博客的第4篇,是听了陈老师的报告后的记录,主要包括如何学习算法。

算法知识点

贪心算法

一个贪心算法总是做出当前最好的选择,也就是说,它期望通过局部最优选择得到全局最优的解决方案。

对于贪心算法,需要注意以下几个问题:

  1. 一旦做出选择,就不可回溯
  2. 有可能得不到最优解
  3. 选择什么样的贪心策略直接决定算法的好坏

什么时候选择贪心算法:

满足贪心选择和最优子结构的问题

算法题目来源

《趣味算法第2版》

算法题目描述

海盗们截获一艘装满各种各样古董的货船,每一件古董都价值连城,但一旦打碎就会失去其原有的价值。海盗船虽然足够大,但载重量是有限的。海盗船的载重量为W WW,每件古董的重量为w i w_{i}w i

,如何才能把尽可能多的古董装上海盗船呢?

做题思路

问题邀请装载的古董尽可能的多,在载重量有限的情况下,优先把重量下的古董装进去,装的最多,可以采用重量最小者优先装的贪心策略,从局部最优达到全局最优,得到最优装载问题的最优解。

采用重量最小最先装,然后每次从余下的古董中选择一个重量最小的古董。


如果采用顺序查找,第1次选择,需要比较n nn次,第2次为n − 1 n-1n−1次,总共需要比较n ( n + 1 ) / 2 n(n+1)/2n(n+1)/2次, 时间复杂度为O ( n 2 ) O(n^{2})O(n 2 )

如果采用快速排序,再按顺序选择,则时间复杂度为O ( n log ⁡ n ) O\left(n \log n\right)O(nlogn)。相比顺序查找更优。

因此如果序列不变的情况下,先排序再选取更好

最终方案

  1. 先排序
  2. 根据贪心策略选择装入的古董

模板代码

# 假设最大载重为 30
W = 30
# 重量分布为
w = [4,10,7,11,3,5,14,2]
# 排序
w_new  = sorted(w)
print(w_new)
print("*"*10)
w_tmp = 0
w_in = []
for i in w_new:
    if (w_tmp < 30) and (w_tmp + i <30) :
        w_tmp = w_tmp + i
        w_in.append(i)
    else:
        w_tmp = w_tmp
print(w_in)
print("*"*10)
print(w_tmp)

输出为:

D:\ProgramData\Anaconda3\envs\py10\python.exe D:/pythonproject/chapter11/csdn博客/chapter02贪心算法.py
[2, 3, 4, 5, 7, 10, 11, 14]
**********
[2, 3, 4, 5, 7]
**********
21



做题过程中遇到的bug及解决方案

这个办法是最优的吗?其实对于本题是最优的,因为要求是获得最多的古董,那么一定是从小到大的古董最多,本体剩余9的载重量没有填满,也无法再填充更大的古董了。

有没有优化空间呢

针对这道题来说,排序部分可以优化下,采用Timsort排序可能会更好些

如果是背包问题,由于考虑最大价值,最小重量等多个问题,我们会提出对应的优化办法

相关文章
|
3月前
|
算法 C++ Python
数据结构与算法===贪心算法
数据结构与算法===贪心算法
|
1月前
|
算法
【算法】贪心算法——柠檬水找零
【算法】贪心算法——柠檬水找零
|
1月前
|
算法
【算法】贪心算法简介
【算法】贪心算法简介
|
2月前
|
算法 Python
Python算法高手进阶指南:分治法、贪心算法、动态规划,掌握它们,算法难题迎刃而解!
【7月更文挑战第10天】探索Python算法的精华:分治法(如归并排序)、贪心策略(如找零钱问题)和动态规划(解复杂问题)。通过示例代码揭示它们如何优化问题解决,提升编程技能。掌握这些策略,攀登技术巅峰。
62 2
|
2月前
|
存储 算法 Python
Python算法界的秘密武器:分治法巧解难题,贪心算法快速决策,动态规划优化未来!
【7月更文挑战第9天】Python中的分治、贪心和动态规划是三大关键算法。分治法将大问题分解为小问题求解,如归并排序;贪心算法每步选局部最优解,不保证全局最优,如找零钱;动态规划存储子问题解求全局最优,如斐波那契数列。选择合适算法能提升编程效率。
49 1
|
2月前
|
存储 算法 大数据
Python算法高手的必修课:深入理解分治法、贪心算法、动态规划,让你的代码更智能!
【7月更文挑战第9天】在Python算法学习中,分治法(如归并排序)将大问题分解为小部分递归解决;贪心算法(如货币找零)在每步选择局部最优解尝试达到全局最优;动态规划(如斐波那契数列)通过存储子问题解避免重复计算,解决重叠子问题。掌握这三种方法能提升代码效率,解决复杂问题。
35 1
|
2月前
|
算法 索引 Python
逆袭算法界!Python分治法、贪心算法、动态规划深度剖析,带你走出算法迷宫!
【7月更文挑战第8天】分治法,如快速排序,将大问题分解并合并解;贪心算法,选择局部最优解,如活动选择;动态规划,利用最优子结构避免重复计算,如斐波那契数列。Python示例展示这些算法如何解决实际问题,助你精通算法,勇闯迷宫。
30 1
|
2月前
|
算法 索引 Python
Python算法设计与分析大揭秘:分治法、贪心算法、动态规划...掌握它们,让你的编程之路更加顺畅!
【7月更文挑战第8天】探索Python中的三大算法:分治(如快速排序)、贪心(活动选择)和动态规划(0-1背包问题)。分治法将问题分解求解再合并;贪心策略逐步求局部最优;动态规划通过记忆子问题解避免重复计算。掌握这些算法,提升编程效率与解决问题能力。
32 1
|
2月前
|
算法 开发者 Python
惊!Python算法界的三大神器:分治法、贪心算法、动态规划,让你秒变算法大师!
【7月更文挑战第8天】在Python编程中,分治、贪心和动态规划是核心算法。分治如归并排序,将大问题拆解并递归求解;贪心算法针对找零问题,每次都选最大面额硬币,追求局部最优;动态规划则通过记忆化避免重复计算,如斐波那契数列。这些算法巧妙地提升效率,解决复杂问题。
25 0
|
3月前
|
算法 Java 定位技术
Java数据结构与算法:贪心算法之最短路径
Java数据结构与算法:贪心算法之最短路径