第四章作业 计硕三班 苗人文 2022222282

m0_70390879 2022-12-31 22:11:15

1.第四章内容及心得:

贪心算法:总是求当前的最优解,而非考虑整体最优解,所以适合求解当前最优同时整体最优的问题。如果贪心算法不能求得整体最优解,但可以求得比较接近整体最优的解,那么可以用来简化一些计算,比如一些np问题,可以用贪心算法求得近似最优解。

当问题的最优解包含子结构的最优解时,称为最优子结构性质,贪心算法和动态规划算法的解都具有这种性质。

2.贪心算法和动态规划不同点:

动态规划考虑之后未来的选择,而贪心算法不需要,因此动态规划是自底向上地解决所有子问题从而全局最优,而贪心算法自顶向下,以迭代的方式不断缩小子问题。所以不能用当前最优解进行迭代的问题,就不能用贪心算法来解。

以0-1背包问题和背包问题为例,由于背包问题中,最优的当前解,和最优全局解是相容的,所以可以用贪心算法,而0-1背包问题中,由于放不放某物品只有两个选择,这导致最优当前解,即价值/费用比值最大的物品,可能导致产生更多不能利用的费用,从而不一定能和最优全局解相容,因此不能用贪心算法,只能用动态规划算法。

3.114页4-2问题

最多比较次数:

a=[1,3,4,8,100,101,2999,3000]
b=[2,4,6,200,10000]
c=[]
i=0
j=0
t=0
for k in range(13):
        
    if a[i]<=b[j]:
        c.append(a[i])
        i=i+1
        t=t+1
    else:
        c.append(b[j])
        j=j+1
        t=t+1
    if i==8:
        for s in range(j,5):
            c.append(b[s])
        break
    if j==5:
        for s in range(i,8):
            c.append(a[s])
        break
print(c)
print(t)

结果:c=[1, 2, 3, 4, 4, 6, 8, 100, 101, 200, 2999, 3000, 10000]
比较次数t=12

4.118页4-14问题

利用哈夫曼树进行合并:

a=[2,4,5,6,7,10,50,1]
b=0
for i in range(10):
    
    tem=a[0]+a[1]
    b=b+tem
    del a[0]
    del a[0]
    a.append(tem)
    a.sort()#重新排序,确保最小的在前面
    if len(a)==1:#合并完成
        break
print(a)
print(b)

最终结果,费用为b=179

还是利用哈夫曼树,只是将最小换成最大

a=[2,4,5,6,7,10,50,1]
b=0
for i in range(10):
    a.sort(reverse=True)#重新排序,确保最大的在前面
    tem=a[0]+a[1]
    b=b+tem
    del a[0]
    del a[0]
    a.append(tem)

    if len(a)==1:#合并完成
        break
    
print(a)
print(b)

结果费用b=529

可见,利用哈夫曼树有效地减少了费用。

 

...全文
192 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-数据结构与算法 发布问题, 以便更快地解决您的疑问

144

社区成员

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

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