第四章贪心

 

活动安排问题:

     问题描述:n个需要排队使用某公共资源的活动,计算安排的相容的最大活动个数,若用动态规划解决,定义子问题:Sij:在第i个活动结束后开始,在第j个活动开始前结束的活动的集合,状态转化方程:Sij=Sik+1+Skj(i<k<j),分析之后虽可行,但时间复杂度太高,考虑用贪心的思想解决,直觉选择结束时间最早的,(这样才能为以后的活动安排让出资源),证明:设am是Sij中结束时间最早的活动,Aij是Sij的一个最大相容活动子集,且ak是Aij中结束时间最早的活动,①若am=ak,命题得证②否则令集合Bij=Aij-{ak}∪{am},因为Aij中的活动都是相容的,而am是所有活动中结束时间最早的,所以,am的结束时间都早于Bij中除am所有活动的开始时间,所以Bij中的活动都是相容的,又因为Aij中的活动个数等于Bij中的活动个数,所以,Bij也是Sij的一个最大相容活动子集且包含am,而最优子结构以包含在用动态规划的证明中,不再阐述,综上所述,命题得证。

     用贪心算法后,时间复杂度为O(n)

哈夫曼编码问题:

   问题描述:给定一个字符集C及每个字符cidde 出现频率fi,求一种最优的前缀编码,使得编码后的代价最短,代价定义:B(T)深度乘以该字符出现的频率,状态转化方程:B(T)=B(Tu)+B(Tv)+频率之和,可行,但同样,代价比较大,那我们想到,是不是可以让频率出现次数少的编码位数长一点,而频率高的编码位数则短一点,因为是二进制编码,可以用树来表示,每次挑两个出现频率较低的字符,“合并”(这里感觉用合并比较想象),再放入树中,继续挑。。。重复,直到全部的字符被合并过,也就是合并到树根。

拓展:多元哈夫曼编码:在一个操场的四周摆放着n堆石子,现要将石子有次序地合并成一堆。规定每次至少选2堆至多选k堆石子合并成新的一堆,
合并的费用为新的一堆石子数。计算出将n堆石子合并成一堆的最大总费用和最小总费用。
算法设计:对于给定的n堆石子,计算合并成一堆的最大总费用和最小总费用。
数据输入:文件的第1行有2个正整数n和k,表示有n堆石子,每次至少选2堆至多选k堆石子合并。第2行有n个数,分别表示每堆石子的个数,最大代价就是,尽可能让权值大(出现频率高)的字符的深度深一点,与哈夫曼编码相反,每次挑两个权值最大的字符,进行合并,而代价最小,即让所有的字符的深度浅一点,尽可能每次都合并最大上限(k)个

单源最短路径问题:

问题描述:在无负权值的有向图中,求所有点到给定点的最小权值

    建一个存放所有点之间距离的邻接矩阵,一个存放所有点到源点的邻接表,一个优先队列,将从源点可直接到达的点及其权值入队,从中选一个权值最小的点出队,在邻接矩阵中遍历其点可直接到达的点,与邻接表相应的距离比较,若d[j]>d[i]+w(i,j),更新,并入队,再循序此操作,直到所有的队列为空,因为这里对更改的点和权值都做了入队操作,所以,出队时,要判断一下这个点是不是已经出过队了,如果出过,则这个点无效(因为之前出的那个点的权值更小),继续出队。时间复杂度为:O((E+V)lgV)

最小生成树:

输入:一个连通非有向图G=(V,E),其权函数为w:E->R

输出:一个连接所有顶点且权值最小的生成树T:

w(T)=所有点之间距离的和

 最优子结构证明:

如图所示,设T是最优MST,T=T1∪{(u,v)}∪T2,设T3比T1更优,则T3∪{(u,v)}∪T2比T更优,与T是最优MST矛盾,所以,T1是T对应部分的最优解。

贪心选择性质证明:(每次选择连接已选点集合和未选点集合中最短的边)

T是最优MST,w(u,v)是连接T1和T2之间最短的边,w(T)=w(T1)+w1(u,v)+w(T2),若w(u,v)=w1(u,v),命题得证,否则,w(Ta)=w(T1)+w(u,v)+w(T2)<w(T),矛盾,所以,命题得证。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值