- 1、本文档共149页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
私有函数从结点开始到结点为止自下向上比较如果子女的值小于父结点的值则相互交换这样将集合重新调整为最小堆关键码比较符在中定义沿父结点路径向上直达根父结点值小不调整父结点结点值大调整回送在堆中插入新元素最小堆的向上调整最小堆的删除算法堆空返回自上向下调整为堆返回最小元素树路径长度两个结点之间的路径长度是连接两结点的路径上的分支数树的外部路径长度是各叶结点外结点到根结点的路径长度之和树的内部路径长度是各非叶结点内结点到根结点的路径长度之和树的路径长度个结点的二叉树的路径长度不小于下述数列前项的和即其路
template class E void MinHeapE::siftUp (int start) { //私有函数: 从结点start开始到结点0为止, 自下向上 //比较, 如果子女的值小于父结点的值, 则相互交换, //这样将集合重新调整为最小堆。关键码比较符= //在E中定义。 int j = start, i = (j-1)/2; E temp = heap[j]; while (j 0) { //沿父结点路径向上直达根 if (heap[i] = temp) break; //父结点值小, 不调整 else { heap[j] = heap[i]; j = i; i = (i-1)/2; } //父结点结点值大, 调整 } * heap[j] = temp; //回送 }; 在堆中插入新元素11 53 17 17 78 78 09 23 45 65 87 i 09 23 45 65 87 j 11 53 j 11 23 i 最小堆的向上调整 * 53 17 11 78 78 09 45 65 87 09 17 45 65 87 j 11 53 23 i 23 17 j i * 最小堆的删除算法 template class E bool MinHeapE::Remove (E x) { if ( !currentSize ) { //堆空, 返回false cout Heap empty endl; return false; } x = heap[0]; heap[0] = heap[currentSize-1]; currentSize--; siftDown(0, currentSize-1); //自上向下调整为堆 return true; //返回最小元素 }; * Huffman树 路径长度 (Path Length) 两个结点之间的路径长度 PL 是连接两结点的路径上的分支数。 树的外部路径长度EPL是各叶结点(外结点)到根结点的路径长度之和 。 树的内部路径长度IPL是各非叶结点(内结点)到根结点的路径长度之和 。 树的路径长度 PL = EPL + IPL。 * 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 IPL = 0+1+1+2 = 4 EPL = 2+2+2+3 = 9 PL = 13 IPL = 0+1+2+3 = 6 EPL = 1+2+3+4 = 10 PL = 16 * n 个结点的二叉树的路径长度不小于下述数列前 n 项的和,即 其路径长度最小者为 完全二叉树满足这个要求。 * 带权路径长度 (Weighted Path Length, WPL) 在很多应用问题中为树的叶结点赋予一个权值,用于表示出现频度、概率值等。因此,在问题处理中把叶结点定义得不同于非叶结点,把叶结点看成“外结点”,非叶结点看成“内结点”。这样的二叉树称为相应权值的扩充二叉树。 扩充二叉树中只有度为 2 的内结点和度为 0的外结点。根据二叉树的性质,有 n 个外结点就有 n-1 个内结点,总结点数为2n-1。 * 若一棵扩充二叉树有 n 个外结点,第 i 个外结点的权值为wi,它到根的路径长度为li,则该外结点到根的带权路径长度为wi*li。 扩充二叉树的带权路径长度定义为树的各外结点到根的带权路径长度之和。 对于同样一组权值,如果放在外结点上,组织方式不同,带权路径长度也不同。 * 具有不同带权路径长度的扩充二叉树 WPL = 2*2+ WPL = 2*1+ WPL = 7*1+ 4*2+5*2+ 4*2+5*3+ 5*2+2*3+ 7*2 = 36 7*3 = 46 4*3 = 35 带权路径长度达到最小 2 2 2 4 4 4 5 5 5 7 7 7 * Huffman树 带权路径长度达到最小的扩充二叉树即为Huffman树。 在Huffman树中,权值大的结点离根最近。 * Huffman树的构造算法 给定 n 个权值 {w0, w1, w2, …, wn-1},构造 具有 n 棵扩充二叉树的森林 F = { T0, T1, T2, …, Tn-1 },其中每棵扩充二叉树 Ti 只有一个带权值 wi 的根结点, 其左、右子树均为空。 重复以下步骤, 直到 F 中仅剩一棵树为止: 在 F 中选取两棵根结点的权值最小的扩充二叉树, 做为左、右
文档评论(0)