#include<iostream>
using namespace std;
#define MAX 1001
#define INF 99999999
struct stuTreeNode
{
int nFr;
int nLeft;
int nRight;
};
struct stuNodeTow
{
int nA;
int nB;
};
void vInputNode(int nN,int nNode[],bool bVist[]);
void vBuildTree(int nN,int nNode[],bool bVist[],stuTreeNode stuTree[]);
stuNodeTow stuGetAB(int nC,int nNode[],bool bVist[]);
void vGetCode(int nHaCode[],stuTreeNode stuTree[],int nRoot,int nDepth);
void vOutputSum(int nN,int nNode[],int nHaCode[]);
int main()
{
int nNum;
int nFrNode[2*MAX];
int nCode[2*MAX];
bool bIsVist[2*MAX];
stuTreeNode stuTree[2*MAX];
while(1 == scanf("%d",&nNum))
{
vInputNode(nNum,nFrNode,bIsVist);
memset(stuTree,0,sizeof(stuTree));
vBuildTree(nNum,nFrNode,bIsVist,stuTree);
vGetCode(nCode,stuTree,2*nNum-1,0);
vOutputSum(nNum,nFrNode,nCode);
}
return 0;
}
void vInputNode(int nN,int nNode[],bool bVist[])
{
int i;
for(i=1;i<=nN;i++)
{
scanf("%d",&nNode[i]);
bVist[i] = true;
bVist[i+nN] = false;
}
}
void vBuildTree(int nN,int nNode[],bool bVist[],stuTreeNode stuTree[])
{
int nCount;
stuNodeTow stuNodeAB;
nCount = nN;
while(nCount < 2*nN-1)
{
stuNodeAB = stuGetAB(nCount,nNode,bVist);
nCount ++;//相加后节点值的下标
bVist[nCount] = true;//相加后节点值为新节点
bVist[stuNodeAB.nA] = false;//已访问
bVist[stuNodeAB.nB] = false;//已访问
stuTree[nCount].nLeft = stuNodeAB.nA //下标赋值给左子树
stuTree[nCount].nRight = stuNodeAB.nB;
nNode[nCount] = nNode[stuNodeAB.nA] + nNode[stuNodeAB.nB];//当前值最小两节点的和
stuTree[nCount].nFr = nNode[nCount];
}
}
//遍历所有没有用到过的节点,查找最小的两个节点,返回其下标
stuNodeTow stuGetAB(int nC,int nNode[],bool bVist[])
{
int i;
stuNodeTow stuAB;
int nTemp1,nTemp2;
nTemp1 = INF;
nTemp2 = INF;
stuAB.nA = 1;
stuAB.nB = 1;
for(i=1;i<=nC;i++)
{
if(bVist[i])
{
if(nNode[i] < nTemp1)
{
nTemp2 = nTemp1;
stuAB.nB = stuAB.nA;
nTemp1 = nNode[i];
stuAB.nA = i;
}
else
if(nNode[i] < nTemp2)
{
nTemp2 = nNode[i];
stuAB.nB = i;
}
}
}
return stuAB;
}
void vGetCode(int nHaCode[],stuTreeNode stuTree[],int nRoot,int nDepth)
{
int nL,nR;
nL = stuTree[nRoot].nLeft;
if(nL != 0)
{
vGetCode(nHaCode,stuTree,nL,nDepth+1);
}
else
{
nHaCode[nRoot] = nDepth;
return ;
}
nR = stuTree[nRoot].nRight;
if(nL != 0)
{
vGetCode(nHaCode,stuTree,nR,nDepth+1);
}
else
{
nHaCode[nRoot] = nDepth;
return ;
}
}
void vOutputSum(int nN,int nNode[],int nHaCode[])
{
int i;
int nAns;
nAns = 0;
for(i=1;i<=nN;i++)
{
nAns += nHaCode[i]*nNode[i];
}
printf("%d\n",&nAns);
}
分享到:
相关推荐
### 哈夫曼编码的贪心算法设计 #### 实验背景与意义 哈夫曼编码是一种广泛应用的数据压缩技术,特别是在文件压缩领域有着极其重要的作用。哈夫曼编码利用了贪心算法的思想来构建最优的前缀编码树,进而达到高效...
### 贪心算法解哈夫曼编码问题 #### 概述 哈夫曼编码(Huffman Coding)是一种广泛应用于数据压缩领域的编码方法,由David A. Huffman在1952年提出。它通过构建一棵特殊的二叉树——哈夫曼树来实现对数据的有效...
《哈夫曼编码(贪心算法)报告》 哈夫曼编码是一种基于贪心策略的高效数据文件压缩编码方法,其核心在于通过构建最优前缀码来实现编码效率的最大化。在本实验报告中,我们将深入理解哈夫曼编码的工作原理、设计思想...
哈夫曼编码是一种高效的数据编码方法,主要用于无损...总的来说,哈夫曼编码是一种有效的数据压缩技术,其C语言实现涉及数据结构和算法的综合运用。通过理解和应用哈夫曼编码,我们可以更好地优化数据存储和传输效率。
"哈夫曼编码和贪心算法" 哈夫曼编码是一种广泛用于数据文件压缩的编码方法,其压缩率通常在20%~90%之间。哈夫曼编码算法用字符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表示方式。 哈夫曼编码的...
哈夫曼编码的主要思想是通过构造一棵二叉树,利用贪心算法来生成最优前缀码。 哈夫曼编码的优点是它可以根据字符的频率来分配编码长度,高频率字符的编码长度较短,低频率字符的编码长度较长,从而减少了数据的存储...
哈夫曼编码的构建过程可以用贪心算法来实现。以下是详细步骤: 1. **建立数学模型**:首先,我们需要一个字符集及其对应的出现频率。每个字符对应一个权值,权值表示该字符在文本中出现的次数。我们的目标是构建一...
哈夫曼编码是一种高效的数据编码方法,常用于数据压缩领域,其主要原理是利用贪心算法构建最优的二叉树,即哈夫曼树。在哈夫曼编码中,频率较高的字符会被赋予较短的编码,反之频率较低的字符则编码较长,以此达到对...
哈夫曼编码是一种高效的数据编码方法...总结来说,哈夫曼编码是贪心算法在数据压缩领域的成功应用,通过构建优化的二叉树结构,实现了根据字符出现频率的动态编码,有效地减少了存储需求,提高了数据传输和存储的效率。
哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法。其压缩率通常在20%~90%之间。哈夫曼编码算法用字符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表示方式。资源为哈夫曼编码可执行文件
总结来说,C语言实现哈夫曼编码需要理解其基本原理,设计合适的数据结构,编写构建和遍历哈夫曼树的算法,以及生成和存储编码表。同时,计算平均码长能帮助评估编码效率。提供的"哈夫曼编码.docx"可能是关于这一主题...
本项目通过Python编程语言实现了贪心算法,应用于哈夫曼编码、活动安排、背包问题等经典场景,展示了贪心策略在解决实际问题中的应用。 哈夫曼编码是一种高效的前缀编码方法,用于无损数据压缩。其基本思想是:将...
哈夫曼编码算法是通过使用字符在文件中出现的频率表来构造最优前缀码的贪心算法。所谓前缀码,即是任一字符的编码都不是其他字符编码的前缀。哈夫曼算法以自底向上的方式,将各字符(n个)存在叶节点中,通过n-1次...
总之,哈夫曼编码是一种实用的压缩技术,通过贪心算法实现,其效率和效果在数据处理领域得到了广泛应用。这个实验提供了亲手实现和理解这一算法的机会,有助于提升对数据压缩原理的理解和编程技能。
在教学和研究领域,哈夫曼编码经常被作为案例用于教授贪心算法的课程设计。通过C++语言实现哈夫曼编码算法,可以锻炼学生掌握基本算法概念和编程技能。在实验过程中,学生们不仅需要理解算法的原理和实现步骤,还...
哈夫曼编码是一种高效的前缀编码方法,它根据数据出现频率分配最短的二进制码,频繁出现的字符拥有较短的编码,从而减少传输或存储的数据量。 实验报告中提到的实验目的是为了让学生熟练掌握树形结构,特别是哈夫曼...
哈夫曼编码是一种高效的数据压缩方法,主要用于无损数据压缩,尤其...通过这个实验,学生不仅可以掌握哈夫曼编码的理论知识,还能提高实际编程能力,理解贪心算法的应用,为后续的高级数据结构和算法学习打下坚实基础。
哈夫曼编码的C#实现 字母表:a,b,c,d,e,f 关键字序列:45,13,12,16,9,5 以上是测试数据
哈夫曼编码是一种高效的数据压缩方法,它基于贪心算法构建一种特殊的二叉树——哈夫曼树。在哈夫曼编码中,每个字符都对应一个唯一的二进制编码,这些编码是前缀码,即没有一个编码是另一个编码的前缀,这样可以避免...
java算法分析与设计之哈夫曼编码源代码 算法作为计算机专业学生的必修课,同时也是软件开发过程中必备的编程思想,对学习研究计算机专业意义重大;正因为这门课程难,所以除了相关方面的书籍,网络资源少的可怜,尤其...