首页 > 其他分享 >哈夫曼树

哈夫曼树

时间:2023-11-13 22:24:41浏览次数:18  
标签:哈夫曼 int Tree k2 k1 parr NULL

8

4 5 1 2 1 3 1 1 

#include<bits/stdc++.h>
using namespace std;
typedef struct tree{
int data;
struct tree* Lchild;
struct tree* Rchild;
}Tree,*Huffman;
Huffman createTree(int arr[],int max)
{
Huffman parr[max];
Huffman p,root=NULL;
for(int i=0;i<max;i++)
{
p=(Huffman)malloc(sizeof(Tree));
p->data=arr[i];
p->Lchild=p->Rchild=NULL;
parr[i]=p;
}
for(int i=1;i<max;i++)
{
//进行n-1次循环建立哈夫曼树
//k1表示森林中具有最小权值的根节点的下标,k2为次最小的下标
int k1=-1,k2;
for(int j=0;j<max;j++)
{
if(parr[j]!=NULL&&k1==-1)
{
k1=j;
continue;
}
if(parr[j]!=NULL)
{
k2=j;
break;
}
}
//将指针数组中的指针指向的最小值赋值给索引号为k1的,次小值赋值给索引号为k2的
for(int j=k2;j<max;j++)
{
if(parr[j]!=NULL)
{
if(parr[j]->data<parr[k1]->data)
{
k2=k1;
k1=j;
}else if(parr[j]->data<parr[k2]->data)
{
k2=j;
}
}
}
//由最小权树和次最小权值树建立一颗新树,root指向树根结点
root=(Huffman)malloc(sizeof(Tree));
root->data=parr[k1]->data+parr[k2]->data;
root->Lchild=parr[k1];
root->Rchild=parr[k2];
parr[k1]=root;//将指向新树的指针赋给parr指针数组中k1位置
parr[k2]=NULL;//k2位置为空
}
return root;
}
//计算权值
int WeightLength(Huffman Tree,int len)
{
if(Tree==NULL)
return 0;
else
{
if(Tree->Lchild==NULL&&Tree->Rchild==NULL){
return Tree->data*len;//访问到叶节点
}else{
return WeightLength(Tree->Lchild,len+1)+WeightLength(Tree->Rchild,len+1);
}
}
}
int main()
{
int Arr[10000];
int max;
cin>>max;
for(int i=0;i<max;i++)
{
scanf("%d",&Arr[i]);
}
Huffman root=createTree(Arr,max);//返回指向哈夫曼数根节点的指针;
cout<<WeightLength(root,0)<<endl;
return 0;
}

 

标签:哈夫曼,int,Tree,k2,k1,parr,NULL
From: https://www.cnblogs.com/djcf/p/17830411.html

相关文章

  • 【树】哈夫曼树-频率大的短编码
    解决问题:对一篇电报编码:Helloworld这里面除去符号,最多的字母是o,若要转换为01二进制尽量编码短;最少的字母h,编码长。h1;e1;r1;d1;w1;o2;l3;-开始手动编码--每次选取频次最小左小右大做孩子,加入一个父节点(值为孩子频次和)编码: -树最多2X元素长度-1个节......
  • 哈夫曼树Huffman tree
    哈夫曼树Huffmantree一句话解释,哈夫曼树将一个softmax的多分类问题转换成了多个logistic的二分类问题以连续词袋模型(CBOW)为例,输入多个词向量,输出层则输出最可能的w,最简的实现自然是softmax,但为了计算难度,使用哈夫曼树简化计算pwp^wpw为从根节点到词汇w叶子节点对应的路径......
  • 哈夫曼编码效率问题
    例题给出问题解决......
  • 最优二叉树—哈夫曼(huffman)树
    哈夫曼树又称最优二叉树,是一类带权路径长度最短的二叉树,有着广泛的应用。基本概念权:将树中的结点赋上一个有着某种意义的数值路径:从A结点道B结点所经过的分支序列路径长度:从A结点道B结点所经过的分支数目查找效率平均查找长度(ASL)取决于树的高度ASL=(1+2*2+3)/4=2     ......
  • 哈夫曼编码及例程
    哈夫曼编码是一种常见的无损压缩算法,通过根据字符出现的频率构建一个最优编码树,将频率较高的字符用较短的编码表示,从而实现数据的压缩。下面是一个简单的例程来演示如何使用哈夫曼编码进行文本数据的压缩和解压缩。压缩过程:统计输入文本中每个字符的出现频率。根据字符频率构建哈夫......
  • 【POJ 3253】Fence Repair 题解(贪心算法+优先队列+哈夫曼树)
    农夫约翰想修理牧场周围的一小段围栏。他测量了围栏,发现他需要N(1≤N≤20000)块木板,每块木板都有一定的整数长度Li(1≤Li≤50000)单位。然后,他购买了一块长度刚好足以锯入N块木板的长木板(即,其长度为Li长度的总和)。FJ忽略了“切口”,即锯切时锯屑损失的额外长度;你也应该忽略它。FJ伤心地......
  • 【POJ 1521】Entropy 题解(贪心算法+优先队列+哈夫曼树)
    熵编码器是一种数据编码方法,通过对删除了“浪费”或“额外”信息的消息进行编码来实现无损数据压缩。换句话说,熵编码去除了最初不需要的信息,以准确编码消息。高度的熵意味着一条消息包含大量浪费的信息;以ASCII编码的英文文本是具有极高熵的消息类型的示例。已经压缩的消息,如JPEG图......
  • 【UVA 12676】Inverting Huffman 题解(哈夫曼树)
    静态霍夫曼编码是一种主要用于文本压缩的编码算法。给出的文本为由N个不同字符组成的特定大小,算法选择N个代码,每个代码对应一个不同的字符性格使用这些代码压缩文本。为了选择代码,算法构建一个有N片叶子的二元根树。对于N≥2,树可按如下方式构建。1.对于文本中的每个不同字符,构......
  • 【模板】哈夫曼树
    postedon2021-08-0220:03:57|under学术|source网上对哈夫曼树的讲解太少了清一色指针整个OIer能看的吧虽然还是很恶心下面是哈夫曼树的模板,解决的是经典问题:压缩字符串#include<queue>#include<string>#include<iostream>usingnamespacestd;template<int......
  • 哈夫曼树与哈夫曼编码
    哈夫曼树与哈夫曼编码哈夫曼博士判断树:用于分类过程的二叉树.如果采用右面的方法建立二叉树则需要比较31500次我们还可以采用左边的方法建立树需要比较22000次显然两种判别树的效率是不一样的如何找到效率最高的判别树?这就是哈夫曼树(最优二叉树)哈夫曼树的基本概念......