计硕二班 2022222252 毛舜 《算法设计与分析》第四章 贪心算法 作业

S6_666666 2022-12-29 21:53:39

1. 概括第四章学习内容,总结第四章学习心得。

贪心算法思想

贪心算法常用于优化问题近似解的求解。在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。它的求解过程是:从问题的初始状态出发,通过若干次贪心选择而得出问题的最优解。

贪心算法的特点

1.贪心算法在解决问题的策略上目光短浅,只根据当前已有的求解信息做出局部最优选择,而且一旦做出选择,不管将来有什么结果,这个选择都不会改变。

2.贪心法每次所作出的选择只是在某种意义上的局部最优选择,这种局部最优选择并不是总能保证获得问题的整体最优解,但通常能获得近似最优解。

3.在众多的计算机算法中,贪心策略是最能接近人们日常思维的一种解题策略。

4.最优子结构性质:一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。

5.贪心选择性质:贪心选择性质是指所求问题的整体最优解可以通过一系列的局部最优选择得到。

贪心酸法的设计

  • 按照贪心选择策略对数据进行预处理;
  • 其求解过程是多步局部最优选择的判断过程,最终的贪心选择序列对应于问题解;
  • 局部最选择判断依据某种贪心选择策略,贪心选择的好坏决定算法成败;
  • 贪心选择性质需要进行正确性证明。

贪心算法实例

活动安排问题 背包问题 哈夫曼编码 单源最短路径 最优装载问题  最小生成树

学习心得

  • 贪心算法是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致是最好或者最优的算法,贪心算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。
  • 对于一个具体问题,要确定它是否具有贪心选择的性质,我们必须证明每一步所作的贪心选择最终导致问题的最优解。
  •  贪心算法的求解过程,知道了贪心选择、最优解、最优子结构的概念。学会了贪心算法求解问题的设计思想,学习了活动安排问题、背包问题、最优装载问题、哈夫曼编码、单源最短路径、最小生成树等问题的思想和贪心算法设计。

2. 以{0-1}背包问题和背包问题为例,讨论动态规划算法与贪心算法的异同。

相同点:最优子结构性质 

不同点:

  • 动态规划算法在每一步所做的选择都依赖与相关子问题的解,因此只有在解出相关子问题时才能做出选择。贪心算法只有在当前状态下做出最好选择,即局部最优选择,然后再去解做出这个选择后产生的相应子问题。
  • 动态规划算法通常是自底向上的方式解各个子问题。而贪心算法通常采用自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每做一次贪心选择就将所求问题简化为规模更小的子问题。
  •  贪心算法无法解决动态规划的问题,动态规划的问题可以解决贪心算法的问题。但是贪心算法的效率高于动态规划算法。

3. 算法实验2:完成教材114页算法实现题4-2总结实验出现问题及解决方法。

给定k个排好序的序列s1, $2,…, sg,用2路合并算法将这k个序列合并成一个序列。假设采用的2路合并算法合并2个长度分别为m和n的序列需要m+n-1次比较。试设计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。

def Most(num, n):
    num1 = num.copy()
    num1.sort(reverse=True)  # 降序
    Times = 0
    times = 0
    for i in range(n - 2):
        times = num1[0] + num1[1]
        Times = Times + times - 1
        del num1[0]
        del num1[0]
        num1.append(times)
        num1.sort(reverse=True)
    times = num1[0] + num1[1] - 1
    Times = Times + times
    return Times
 
def Least(num, n):
    num2 = num.copy()
    num2.sort()  # 升序
    Times = 0
    times = 0
    for i in range(n - 2):
        times = num2[0] + num2[1]
        Times = Times + times - 1
        del num2[0]
        del num2[0]
        num2.append(times)
        num2.sort()
    times = num2[0] + num2[1] - 1
    Times = Times + times
    return Times
 
if __name__ == '__main__':
    num = [11, 10, 4, 5,6]
    n = len(num)
    print(Most(num, n))
    print(Least(num, n))
D:\PYC\pythonProject3\venv\Scripts\python.exe D:/PYC/pythonProject/10/7.py
112
77

Process finished with exit code 0

5. 算法实验2:完成教材118页算法实现题4-14总结实验出现问题及解决方法。

在一个操场的四周摆放着n堆石子。现要将石子有次序地合并成一堆。规定每次至少选2堆,最多选k堆石子合并成新的一堆,合并的费用为新的一堆的石子数。试设计一个算法,计算出将n堆石子合并成一堆的最大总费用和最小总费用。

n = int(input("请输入需要合并的石子堆数:"))
k = int(input("请输入每次最多合并的石子堆数:"))
arr=input("请输入每堆石子的个数:")
p =[int(i) for i in arr.split()]
p.sort()
#最大总费用
max = 0;
max1 = p[n-1];
for i in range(n-2,-1,-1):
    if p[i] == 0:
        break
    max1 += p[i]
    max += max1
#最小总费用
i=0
min = 0
min1 = 0
while i<n-1:
        min1=0;
        p = p + [0]
        for j in range(0,k):
            min1+=p[i]
            i+=1
        p[n]=min1
        n+=1
        min+=min1;
        #将i-n部分排序
        p[i:n] = sorted(p[i:n])
print("最大总费用为:" ,max ,"\n最小总费用为:" , min )
D:\PYC\pythonProject3\venv\Scripts\python.exe D:/PYC/pythonProject/10/7.py
请输入需要合并的石子堆数:6
请输入每次最多合并的石子堆数:2
请输入每堆石子的个数:11 22 33 44 55 66
最大总费用为: 935 
最小总费用为: 561

Process finished with exit code 0

 

...全文
25 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-数据结构与算法 发布问题, 以便更快地解决您的疑问
内容概要:本文档提供了适用于算法竞赛的Java语言模板代码,重点涵盖动态规划与图论两大核心领域。动态规划部分包括01背包、完全背包、多重背包的二进制拆分优化、最长上升子序列(LIS)的O(n log n)解法以及最长公共子序列(LCS)的标准DP实现。图论部分涵盖了Dijkstra(堆优化)、SPFA(可检测负环)、Floyd-Warshall(多源最短路径)、Kruskal和Prim(最小生成树)等经典算法。此外还包含网络流领域的Dinic算法完整模板及其使用示例,适用于解决最大流问题。所有代码均以简洁高效的竞赛风格编写,具备直接应用价值。; 适合人群:具备Java编程基础,正在准备程序设计竞赛(如ACM/ICPC、蓝桥杯、力扣周赛等)的学生或开发者,尤其是对算法实现细节有较高要求的中高级选手。; 使用场景及目标:①快速查阅和复用经典算法模板,提升竞赛中的编码效率;②深入理解动态规划与图论算法的核心实现机制,强化算法调试与优化能力;③通过Dinic等高级算法掌握网络流问题的建模与求解方法; 阅读建议:建议结合实际题目进行练习,理解每段代码的边界条件与数据结构设计,注重对算法复杂度和适用范围的掌握,并在实践中不断优化个人模板库。

144

社区成员

发帖
与我相关
我的任务
社区描述
高校教学社区
软件工程 高校
社区管理员
  • dainwnu
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧