算法设计技巧与分析(五):贪心算法(The Greedy Approach)


贪心算法(The Greedy Approach)

一、部分背包问题(The Fractional Knapsack Problem)

给定大小为s1、s2、…、sn的n个项目以及值v1、v2、…、vn和大小C、背包容量,目标是找到使总和最大化的非负实数x1、x2、…、xn:
在这里插入图片描述
对于每个项目,计算yi=vi/si,即其值与其大小的比率。按递减比例对物品进行分类,并尽可能多地从第一件物品到第二件物品填充背包,依此类推。

二、最短路径问题

Dijkstra算法

在这里插入图片描述

算法的伪代码如下:

Input:带权有向图G(V,E)
Output:顶点1到其他顶点的路径
X = {1}//走过的
Y = V - {1}//没走过的
m[1] = 0
for y = 2 to n://初始化
	if y相邻于1:
		m[y] = length[1,y]
	else:
		m[y] = inf
for j = 1 to n-1:
	令y属于Y,使得m[y]为最小//需要执行O(n)次
	将y加入X
	将y从Y中删除
	for 每一个(y,w):
		if w属于Y and m[y]+length[y,w] < m[w]://如果新加入的点能使X中的点到w的距离更近
			m[w] = m[y]+length[y,w]//m[w]储存的是距离w最近的距离长度

令y属于Y,使得m[y]为最小的过程需要执行O(n)次,故其所需的全部时间为O(N^2)。for 每一个(y,w),其对于所有节点,所需的时间为2m次(因为每条边都被考虑两次),即O(m)。故算法的时间复杂度为O( N 2 N^2 N2)

Kruskal算法

在这里插入图片描述

三、文件压缩(File Compression)

在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值