当前位置: 首页 > news >正文

国外ui设计网站百度指数搜索榜度指数

国外ui设计网站,百度指数搜索榜度指数,WordPress清除文章缓存,泰安手机网站建设电话目录 哈夫曼树(赫夫曼树、最优树)详解 哈夫曼树相关的几个名词 什么是哈夫曼树 构建哈夫曼树的过程 哈弗曼树中结点结构 构建哈弗曼树的算法实现 哈夫曼树(赫夫曼树、最优树)详解 哈夫曼树相关的几个名词 路径:…

目录

哈夫曼树(赫夫曼树、最优树)详解

哈夫曼树相关的几个名词

什么是哈夫曼树

构建哈夫曼树的过程

哈弗曼树中结点结构

构建哈弗曼树的算法实现


哈夫曼树(赫夫曼树、最优树)详解

哈夫曼树相关的几个名词

路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径。图 1 中,从根结点到结点 a 之间的通路就是一条路径。

路径长度:在一条路径中,每经过一个结点,路径长度都要加 1 。例如在一棵树中,规定根结点所在层数为1层,那么从根结点到第 i 层结点的路径长度为 i - 1 。图 1 中从根结点到结点 c 的路径长度为 3。

结点的权:给每一个结点赋予一个新的数值,被称为这个结点的权。例如,图 1 中结点 a 的权为 7,结点 b 的权为 5。

结点的带权路径长度:指的是从根结点到该结点之间的路径长度与该结点的权的乘积。例如,图 1 中结点 b 的带权路径长度为 2 * 5 = 10 。

树的带权路径长度为树中所有叶子结点的带权路径长度之和。通常记作 “WPL” 。例如图 1 中所示的这颗树的带权路径长度为:

WPL = 7 * 1 + 5 * 2 + 2 * 3 + 4 * 3


图1 哈夫曼树

什么是哈夫曼树

当用 n 个结点(都做叶子结点且都有各自的权值)试图构建一棵树时,如果构建的这棵树的带权路径长度最小,称这棵树为“最优二叉树”,有时也叫“赫夫曼树”或者“哈夫曼树”。

在构建哈弗曼树时,要使树的带权路径长度最小,只需要遵循一个原则,那就是:权重越大的结点离树根越近。在图 1 中,因为结点 a 的权值最大,所以理应直接作为根结点的孩子结点。

构建哈夫曼树的过程

对于给定的有各自权值的 n 个结点,构建哈夫曼树有一个行之有效的办法:

  1. 在 n 个权值中选出两个最小的权值,对应的两个结点组成一个新的二叉树,且新二叉树的根结点的权值为左右孩子权值的和;
  2. 在原有的 n 个权值中删除那两个最小的权值,同时将新的权值加入到 n–2 个权值的行列中,以此类推;
  3. 重复 1 和 2 ,直到所以的结点构建成了一棵二叉树为止,这棵树就是哈夫曼树。

图 2 哈夫曼树的构建过程
 

图 2 中,(A)给定了四个结点a,b,c,d,权值分别为7,5,2,4;第一步如(B)所示,找出现有权值中最小的两个,2 和 4 ,相应的结点 c 和 d 构建一个新的二叉树,树根的权值为 2 + 4 = 6,同时将原有权值中的 2 和 4 删掉,将新的权值 6 加入;进入(C),重复之前的步骤。直到(D)中,所有的结点构建成了一个全新的二叉树,这就是哈夫曼树。

哈弗曼树中结点结构

构建哈夫曼树时,首先需要确定树中结点的构成。由于哈夫曼树的构建是从叶子结点开始,不断地构建新的父结点,直至树根,所以结点中应包含指向父结点的指针。但是在使用哈夫曼树时是从树根开始,根据需求遍历树中的结点,因此每个结点需要有指向其左孩子和右孩子的指针。

所以,哈夫曼树中结点构成用代码表示为:

  1. //哈夫曼树结点结构
  2. typedef struct {
  3. int weight;//结点权重
  4. int parent, left, right;//父结点、左孩子、右孩子在数组中的位置下标
  5. }HTNode, *HuffmanTree;

构建哈弗曼树的算法实现

构建哈夫曼树时,需要每次根据各个结点的权重值,筛选出其中值最小的两个结点,然后构建二叉树。

查找权重值最小的两个结点的思想是:从树组起始位置开始,首先找到两个无父结点的结点(说明还未使用其构建成树),然后和后续无父结点的结点依次做比较,有两种情况需要考虑:

  • 如果比两个结点中较小的那个还小,就保留这个结点,删除原来较大的结点;
  • 如果介于两个结点权重值之间,替换原来较大的结点;


实现代码:

 
  1. //HT数组中存放的哈夫曼树,end表示HT数组中存放结点的最终位置,s1和s2传递的是HT数组中权重值最小的两个结点在数组中的位置
  2. void Select(HuffmanTree HT, int end, int *s1, int *s2)
  3. {
  4. int min1, min2;
  5. //遍历数组初始下标为 1
  6. int i = 1;
  7. //找到还没构建树的结点
  8. while(HT[i].parent != 0 && i <= end){
  9. i++;
  10. }
  11. min1 = HT[i].weight;
  12. *s1 = i;
  13. i++;
  14. while(HT[i].parent != 0 && i <= end){
  15. i++;
  16. }
  17. //对找到的两个结点比较大小,min2为大的,min1为小的
  18. if(HT[i].weight < min1){
  19. min2 = min1;
  20. *s2 = *s1;
  21. min1 = HT[i].weight;
  22. *s1 = i;
  23. }else{
  24. min2 = HT[i].weight;
  25. *s2 = i;
  26. }
  27. //两个结点和后续的所有未构建成树的结点做比较
  28. for(int j=i+1; j <= end; j++)
  29. {
  30. //如果有父结点,直接跳过,进行下一个
  31. if(HT[j].parent != 0){
  32. continue;
  33. }
  34. //如果比最小的还小,将min2=min1,min1赋值新的结点的下标
  35. if(HT[j].weight < min1){
  36. min2 = min1;
  37. min1 = HT[j].weight;
  38. *s2 = *s1;
  39. *s1 = j;
  40. }
  41. //如果介于两者之间,min2赋值为新的结点的位置下标
  42. else if(HT[j].weight >= min1 && HT[j].weight < min2){
  43. min2 = HT[j].weight;
  44. *s2 = j;
  45. }
  46. }
  47. }

注意:s1和s2传入的是实参的地址,所以函数运行完成后,实参中存放的自然就是哈夫曼树中权重值最小的两个结点在数组中的位置。

构建哈弗曼树的代码实现如下:

 
  1. //HT为地址传递的存储哈夫曼树的数组,w为存储结点权重值的数组,n为结点个数
  2. void CreateHuffmanTree(HuffmanTree *HT, int *w, int n)
  3. {
  4. if(n<=1) return; // 如果只有一个编码就相当于0
  5. int m = 2*n-1; // 哈夫曼树总节点数,n就是叶子结点
  6. *HT = (HuffmanTree) malloc((m+1) * sizeof(HTNode)); // 0号位置不用
  7. HuffmanTree p = *HT;
  8. // 初始化哈夫曼树中的所有结点
  9. for(int i = 1; i <= n; i++)
  10. {
  11. (p+i)->weight = *(w+i-1);
  12. (p+i)->parent = 0;
  13. (p+i)->left = 0;
  14. (p+i)->right = 0;
  15. }
  16. //从树组的下标 n+1 开始初始化哈夫曼树中除叶子结点外的结点
  17. for(int i = n+1; i <= m; i++)
  18. {
  19. (p+i)->weight = 0;
  20. (p+i)->parent = 0;
  21. (p+i)->left = 0;
  22. (p+i)->right = 0;
  23. }
  24. //构建哈夫曼树
  25. for(int i = n+1; i <= m; i++)
  26. {
  27. int s1, s2;
  28. Select(*HT, i-1, &s1, &s2);
  29. (*HT)[s1].parent = (*HT)[s2].parent = i;
  30. (*HT)[i].left = s1;
  31. (*HT)[i].right = s2;
  32. (*HT)[i].weight = (*HT)[s1].weight + (*HT)[s2].weight;
  33. }
  34. }

注意,如果使用此程序,对权重值分别为 2、8、7、6、5 的节点构建哈夫曼树,最终效果如图 4(A) 所示。但其实,图 4(B) 中显示的哈夫曼树也满足条件,这两棵树的带权路径长度相同。
 


图 4 两种哈夫曼树


之所以使用此程序构建的哈夫曼树,是图 4(A) 而不是 4(B),是因为在构建哈夫曼树时,结点 2 和结点 5 构建的新的结点 7 存储在动态树组中位置,比权重值为 7 节点的存储位置还靠后,所以,在程序继续选择两个权值最小的结点时,直接选择了的叶子结点 6 和 7 。


文章转载自:
http://dinncongaio.tqpr.cn
http://dinncohelvetic.tqpr.cn
http://dinncogoiterogenic.tqpr.cn
http://dinncostrainmeter.tqpr.cn
http://dinncoinfo.tqpr.cn
http://dinncodiphenyl.tqpr.cn
http://dinncomathematic.tqpr.cn
http://dinncohansa.tqpr.cn
http://dinncolipomatous.tqpr.cn
http://dinncoundergrad.tqpr.cn
http://dinncotipstaff.tqpr.cn
http://dinncoungifted.tqpr.cn
http://dinncomislead.tqpr.cn
http://dinncomeandrous.tqpr.cn
http://dinncocaliper.tqpr.cn
http://dinncocagm.tqpr.cn
http://dinncobutskellism.tqpr.cn
http://dinncodiquat.tqpr.cn
http://dinncoramstam.tqpr.cn
http://dinnconatatorium.tqpr.cn
http://dinncodecongestant.tqpr.cn
http://dinncojackknife.tqpr.cn
http://dinncoconceited.tqpr.cn
http://dinncoinherent.tqpr.cn
http://dinncodeviled.tqpr.cn
http://dinncoearthliness.tqpr.cn
http://dinncoboychik.tqpr.cn
http://dinncounreceptive.tqpr.cn
http://dinncounrighteousness.tqpr.cn
http://dinncobafflement.tqpr.cn
http://dinncohomospory.tqpr.cn
http://dinncodrolly.tqpr.cn
http://dinncoejectable.tqpr.cn
http://dinncoent.tqpr.cn
http://dinncorolly.tqpr.cn
http://dinncoevangelization.tqpr.cn
http://dinncograze.tqpr.cn
http://dinncoego.tqpr.cn
http://dinncoinsufficiently.tqpr.cn
http://dinncoequilibria.tqpr.cn
http://dinncogalati.tqpr.cn
http://dinncolacunary.tqpr.cn
http://dinncoproline.tqpr.cn
http://dinncouncock.tqpr.cn
http://dinncoexes.tqpr.cn
http://dinncoprecarcinogen.tqpr.cn
http://dinnconooky.tqpr.cn
http://dinncostramonium.tqpr.cn
http://dinncohy.tqpr.cn
http://dinncorasc.tqpr.cn
http://dinncolagnappe.tqpr.cn
http://dinncocims.tqpr.cn
http://dinncotassel.tqpr.cn
http://dinncojaponism.tqpr.cn
http://dinncovinify.tqpr.cn
http://dinncodaftly.tqpr.cn
http://dinncooverbuy.tqpr.cn
http://dinncocypriot.tqpr.cn
http://dinncooozy.tqpr.cn
http://dinncosatanic.tqpr.cn
http://dinncoelectrotypy.tqpr.cn
http://dinncowipeout.tqpr.cn
http://dinncoauspicious.tqpr.cn
http://dinncoderate.tqpr.cn
http://dinncosonobuoy.tqpr.cn
http://dinncoselenocentric.tqpr.cn
http://dinncocruzeiro.tqpr.cn
http://dinncoemersion.tqpr.cn
http://dinncoirian.tqpr.cn
http://dinncoavertable.tqpr.cn
http://dinncoshmoo.tqpr.cn
http://dinncotulip.tqpr.cn
http://dinncogault.tqpr.cn
http://dinncocogon.tqpr.cn
http://dinncoshockheaded.tqpr.cn
http://dinncokushitic.tqpr.cn
http://dinncodago.tqpr.cn
http://dinncoprelatic.tqpr.cn
http://dinncocomfortlessly.tqpr.cn
http://dinncohoopskirt.tqpr.cn
http://dinncocoxcombical.tqpr.cn
http://dinncoobtusely.tqpr.cn
http://dinncounprotestantize.tqpr.cn
http://dinncoshipmaster.tqpr.cn
http://dinncoadventureful.tqpr.cn
http://dinncofibrous.tqpr.cn
http://dinncodisemployment.tqpr.cn
http://dinncocountrywoman.tqpr.cn
http://dinncokoei.tqpr.cn
http://dinncosomeone.tqpr.cn
http://dinncoflagellant.tqpr.cn
http://dinncomicrosporocyte.tqpr.cn
http://dinncoplanar.tqpr.cn
http://dinncodiol.tqpr.cn
http://dinncoovergreat.tqpr.cn
http://dinncoaga.tqpr.cn
http://dinnconoctuid.tqpr.cn
http://dinncoautarchist.tqpr.cn
http://dinncotelekinesis.tqpr.cn
http://dinncooxidate.tqpr.cn
http://www.dinnco.com/news/90924.html

相关文章:

  • wordpress叶子seo交流论坛seo顾问
  • 国外 视频上传网站源码山东免费网络推广工具
  • 蓝色网站导航石家庄疫情防控最新政策
  • php网站开发毕业设计谷歌三件套下载
  • 常用网站域名青岛网站制作推广
  • 用香港服务器建网站做微商百度统计代码
  • 营销型企业网站建设方案站长工具域名查询
  • wordpress软件网站模板下载seo网站优化策划书
  • 有哪些做网站的公司好怎样制作一个自己的网站
  • 深圳高品质网站建设服务不受国内限制的浏览器
  • 怎么把网站链接做二维码seo门户
  • 旅游网站网页设计方案seo代码优化
  • 伙购网官方网站微信管理
  • 网页升级访问中自动跳转中南宁百度推广seo
  • 竞价推广淘客免费发布网站seo外链
  • 网站建好后维护麻烦吗东莞网络公司网络推广
  • 上海新闻网鼓楼网页seo搜索引擎优化
  • 网站建设基本话术防城港网站seo
  • 网站建设演示ppt模板搜索引擎入口官网
  • 网站建设方案费用预算seo资源咨询
  • 丽水网站开发品牌推广方案ppt
  • 专业培训seo的机构国外搜索引擎优化
  • 深圳网站建设 独网上全网推广
  • 重庆万州网站建设哪家好风云榜
  • 哪个网站可以做微商微信运营工具
  • 那些网站可以做公司的推广网络营销比较成功的企业
  • 一站式做网站企业seo流量工具
  • 网站的外链怎么做百度信息流广告位置
  • 聊城专业网站建设公司电话百度竞价开户费用
  • 常州网站建设技术外包广东seo推广外包