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

家私网站栏目和功能需求策划软件开发包括什么内容

家私网站栏目和功能需求策划,软件开发包括什么内容,企业网站导航栏高度,美词原创网站建设目录 哈夫曼树#xff08;赫夫曼树、最优树#xff09;详解 哈夫曼树相关的几个名词 什么是哈夫曼树 构建哈夫曼树的过程 哈弗曼树中结点结构 构建哈弗曼树的算法实现 哈夫曼树#xff08;赫夫曼树、最优树#xff09;详解 哈夫曼树相关的几个名词 路径#xff1a;… 目录 哈夫曼树赫夫曼树、最优树详解 哈夫曼树相关的几个名词 什么是哈夫曼树 构建哈夫曼树的过程 哈弗曼树中结点结构 构建哈弗曼树的算法实现 哈夫曼树赫夫曼树、最优树详解 哈夫曼树相关的几个名词 路径在一棵树中一个结点到另一个结点之间的通路称为路径。图 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 个结点构建哈夫曼树有一个行之有效的办法 在 n 个权值中选出两个最小的权值对应的两个结点组成一个新的二叉树且新二叉树的根结点的权值为左右孩子权值的和在原有的 n 个权值中删除那两个最小的权值同时将新的权值加入到 n–2 个权值的行列中以此类推重复 1 和 2 直到所以的结点构建成了一棵二叉树为止这棵树就是哈夫曼树。 图 2 哈夫曼树的构建过程   图 2 中A给定了四个结点abcd权值分别为7524第一步如B所示找出现有权值中最小的两个2 和 4 相应的结点 c 和 d 构建一个新的二叉树树根的权值为 2 4 6同时将原有权值中的 2 和 4 删掉将新的权值 6 加入进入C重复之前的步骤。直到D中所有的结点构建成了一个全新的二叉树这就是哈夫曼树。 哈弗曼树中结点结构 构建哈夫曼树时首先需要确定树中结点的构成。由于哈夫曼树的构建是从叶子结点开始不断地构建新的父结点直至树根所以结点中应包含指向父结点的指针。但是在使用哈夫曼树时是从树根开始根据需求遍历树中的结点因此每个结点需要有指向其左孩子和右孩子的指针。 所以哈夫曼树中结点构成用代码表示为 //哈夫曼树结点结构typedef struct {int weight;//结点权重int parent, left, right;//父结点、左孩子、右孩子在数组中的位置下标}HTNode, *HuffmanTree; 构建哈弗曼树的算法实现 构建哈夫曼树时需要每次根据各个结点的权重值筛选出其中值最小的两个结点然后构建二叉树。 查找权重值最小的两个结点的思想是从树组起始位置开始首先找到两个无父结点的结点说明还未使用其构建成树然后和后续无父结点的结点依次做比较有两种情况需要考虑 如果比两个结点中较小的那个还小就保留这个结点删除原来较大的结点如果介于两个结点权重值之间替换原来较大的结点 实现代码 //HT数组中存放的哈夫曼树end表示HT数组中存放结点的最终位置s1和s2传递的是HT数组中权重值最小的两个结点在数组中的位置void Select(HuffmanTree HT, int end, int *s1, int *s2){int min1, min2;//遍历数组初始下标为 1int i 1;//找到还没构建树的结点while(HT[i].parent ! 0 i end){i;}min1 HT[i].weight;*s1 i;i;while(HT[i].parent ! 0 i end){i;}//对找到的两个结点比较大小min2为大的min1为小的if(HT[i].weight min1){min2 min1;*s2 *s1;min1 HT[i].weight;*s1 i;}else{min2 HT[i].weight;*s2 i;}//两个结点和后续的所有未构建成树的结点做比较for(int ji1; j end; j){//如果有父结点直接跳过进行下一个if(HT[j].parent ! 0){continue;}//如果比最小的还小将min2min1min1赋值新的结点的下标if(HT[j].weight min1){min2 min1;min1 HT[j].weight;*s2 *s1;*s1 j;}//如果介于两者之间min2赋值为新的结点的位置下标else if(HT[j].weight min1 HT[j].weight min2){min2 HT[j].weight;*s2 j;}}} 注意s1和s2传入的是实参的地址所以函数运行完成后实参中存放的自然就是哈夫曼树中权重值最小的两个结点在数组中的位置。 构建哈弗曼树的代码实现如下 //HT为地址传递的存储哈夫曼树的数组w为存储结点权重值的数组n为结点个数void CreateHuffmanTree(HuffmanTree *HT, int *w, int n){if(n1) return; // 如果只有一个编码就相当于0int m 2*n-1; // 哈夫曼树总节点数n就是叶子结点*HT (HuffmanTree) malloc((m1) * sizeof(HTNode)); // 0号位置不用HuffmanTree p *HT;// 初始化哈夫曼树中的所有结点for(int i 1; i n; i){(pi)-weight *(wi-1);(pi)-parent 0;(pi)-left 0;(pi)-right 0;}//从树组的下标 n1 开始初始化哈夫曼树中除叶子结点外的结点for(int i n1; i m; i){(pi)-weight 0;(pi)-parent 0;(pi)-left 0;(pi)-right 0;}//构建哈夫曼树for(int i n1; i m; i){int s1, s2;Select(*HT, i-1, s1, s2);(*HT)[s1].parent (*HT)[s2].parent i;(*HT)[i].left s1;(*HT)[i].right s2;(*HT)[i].weight (*HT)[s1].weight (*HT)[s2].weight;}} 注意如果使用此程序对权重值分别为 2、8、7、6、5 的节点构建哈夫曼树最终效果如图 4(A) 所示。但其实图 4(B) 中显示的哈夫曼树也满足条件这两棵树的带权路径长度相同。   图 4 两种哈夫曼树 之所以使用此程序构建的哈夫曼树是图 4(A) 而不是 4(B)是因为在构建哈夫曼树时结点 2 和结点 5 构建的新的结点 7 存储在动态树组中位置比权重值为 7 节点的存储位置还靠后所以在程序继续选择两个权值最小的结点时直接选择了的叶子结点 6 和 7 。
http://www.dnsts.com.cn/news/54189.html

相关文章:

  • 湖南做网站 地址磐石网络wordpress more标签失效
  • 新开传奇网站刚开一秒第一区合肥网络公司网站建设
  • 石碣做网站网站开发作业代做
  • 个人网站内容电脑云桌面下载
  • 计算机网站开发就业形势安装wordpress注意什么意思
  • 横山桥网站微信朋友圈广告30元 1000次
  • 怎样建英文网站软件推广赚钱一个10元
  • 商务网站的特点自己设计商标logo软件
  • 手机网站做多宽的图片wordpress+jetpack插件
  • 网页站点怎么命名完整网站开发需要多久
  • 郑州哪家做网站好盐城网站开发基本流程
  • 搜索引擎营销的优势和劣势丽水网站seo
  • 用博客网站做淘宝客微信版网站制作
  • 多个wordpress站点同步学字体网站
  • 衡水哪有建网站的吗g时代网站建设
  • 营销网站建站公司哪家好中美网站建设
  • 教育资源网站建设网站模版 拓
  • 做门户网站难吗少儿编程培训
  • 彩票网站开发租用焦作商城网站建设
  • 做网站调用无广告视频墙纸 html 网站模板
  • 做网站用什么主机好wordpress登入后台
  • 做服务的网站吗电子商务平台的建设步骤
  • 天津市建设工程评标专家网站凡科建站是不是免费的
  • 做网站的用什么软件呢品牌策划的七个步骤
  • 网站建设ppt方案高端零食品牌有哪些
  • 域名费用和网站服务器费用是同样的吗wordpress 风格
  • 网站seo与网站没关昌图门户网站
  • 哈尔滨企业建站系统类似站酷的设计网站
  • 安徽专业网站建设设计罗湖做网站
  • python 网站开发 案例音乐网站建设的目的