144
社区成员
发帖
与我相关
我的任务
分享贪心算法:总是求当前的最优解,而非考虑整体最优解,所以适合求解当前最优同时整体最优的问题。如果贪心算法不能求得整体最优解,但可以求得比较接近整体最优的解,那么可以用来简化一些计算,比如一些np问题,可以用贪心算法求得近似最优解。
当问题的最优解包含子结构的最优解时,称为最优子结构性质,贪心算法和动态规划算法的解都具有这种性质。
动态规划考虑之后未来的选择,而贪心算法不需要,因此动态规划是自底向上地解决所有子问题从而全局最优,而贪心算法自顶向下,以迭代的方式不断缩小子问题。所以不能用当前最优解进行迭代的问题,就不能用贪心算法来解。
以0-1背包问题和背包问题为例,由于背包问题中,最优的当前解,和最优全局解是相容的,所以可以用贪心算法,而0-1背包问题中,由于放不放某物品只有两个选择,这导致最优当前解,即价值/费用比值最大的物品,可能导致产生更多不能利用的费用,从而不一定能和最优全局解相容,因此不能用贪心算法,只能用动态规划算法。
最多比较次数:
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
利用哈夫曼树进行合并:
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
可见,利用哈夫曼树有效地减少了费用。