算法分析第4章 贪心算法.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* 欢迎辞 * 4.3 最优装载 2、贪心选择性质  贪心选择得到的解A为最优解:因为其它解B中选择了比解A更重的集装箱,用A中的集装箱替代B中更重的集装箱后得到的新解比B有更小的重量。 3、最优子结构性质   最优装载问题具有最优子结构性质:其最优解包含子问题的最优解。   由最优装载问题的贪心选择性质和最优子结构性质,容易证明算法loading的正确性。   算法loading的主要计算量在于将集装箱依其重量从小到大排序,故算法所需的计算时间为 O(nlogn)。 作业 算法分析题4-3 算法设计题4-1 * * 4.4 哈夫曼编码   哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法。其压缩率通常在20%~90%之间。哈夫曼编码算法用字符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表示方式。   给出现频率高的字符较短的编码,出现频率较低的字符以较长的编码,可以大大缩短总码长。 1、前缀码   对每一个字符规定一个0,1串作为其代码,并要求任一字符的代码都不是其它字符代码的前缀。这种编码称为前缀码。 * 4.4 哈夫曼编码   编码的前缀性质可以使译码方法非常简单。   表示最优前缀码的二叉树总是一棵完全二叉树,即树中任一结点都有2个儿子结点。   平均码长定义为:   使平均码长达到最小的前缀码编码方案称为给定编码字符集C的最优前缀码。 * 4.4 哈夫曼编码 2、构造哈夫曼编码   哈夫曼提出构造最优前缀码的贪心算法,由此产生的编码方案称为哈夫曼编码。   哈夫曼算法以自底向上的方式构造表示最优前缀码的二叉树T。   算法以|C|个叶结点开始,执行|C|-1次的“合并”运算后产生最终所要求的树T。 使用类实现Huffman算法 templateclass Type class Huffman{ friend BinaryTreeint HuffmanTree(Type[],int); public: operator Type() const {return weigth;} private: BinaryTreeint tree;//int型的二叉树 Type weigth; }; * 使用友元函数构造Huffman树 template class Type BinaryTreeint HuffmanTree(Type f[],int n){ HuffmanType *w=new HuffmanType[n+1]; BinaryTreeint z,zero; for(int i=1;i=n;i++){z.MakeTree(i,zero,zero);w[i].weigth=f[i];w[i].tree=z;} MinHeap HuffmanType Q(1); Q.Initialize(w,n,n); HuffmanType x,y; for(int i=1;in;i++){ Q.DeleteMin(x); Q.DeleteMin(y); z.MakeTree(0,x.tree,y.tree); x.weigth+=y.weigth;x.tree=z; Q.Insert(x); } Q.DeleteMin(x); Q.DeleteMin(y); delete[] w;return x.tree;} * * 4.4 哈夫曼编码   在书上给出的算法huffmanTree中,编码字符集中每一字符c的频率是f(c)。以f为键值的优先队列Q用在贪心选择时有效地确定算法当前要合并的2棵具有最小频率的树。一旦2棵具有最小频率的树合并后,产生一棵新的树,其频率为合并的2棵树的频率之和,并将新树插入优先队列Q。经过n-1次的合并后,优先队列中只剩下一棵树,即所要求的树T。   算法huffmanTree用最小堆实现优先队列Q。初始化优先队列需要O(n)计算时间,由于最小堆的removeMin和put运算均需O(logn)时间,n-1次的合并总共需要O(nlogn)计算时间。因此,关于n个字符的哈夫曼算法的计算时间为O(nlogn) 。 堆(小顶堆) 1.根结点的值小于子树上结点的值 2.是一完全二叉树 3.插入时先插入到最后一个结点后面,修改结点个数,当插入后小于其父结点时与其父结点交换,直到成为堆时止。 4.删除根时,将最后一个结点交换到根,将结点个数减1,然后进行堆化 5.堆化(HEAPIFY),当不成为堆时,将该结点与其子结点中较小的交换 例:将数据:5,3,6,4,2,1建成一个小顶堆 * * 4.4 哈夫曼编码 3、哈夫曼算法的正确性   要证明哈夫曼算法的正确性,只要证明最优前缀码问题具有贪心选择性质和最优子结构性质

文档评论(0)

JuanHuang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档