`

数据结构与算法:哈夫曼树(源码)!

阅读更多

这些天明白了一个道理,搞技术也是需要激情的。

也不知道为什么这段过的感觉特别的不爽,也不知道是因为快要考试了,心里没底,而带来的恐惧,还是

搞技术太久,心里想放个假,总之是过的晕晕乎乎,做事情也总是反应迟钝,思维也不快,我爸妈说我是因为睡

不够,但是我觉得我一晚上睡6个半小时,也不算短了。真不知道这样的感觉还要持续多久。

习惯了,下课就做到电脑前,习惯了,晚上一个人回宿舍,习惯了,饿了随便吃点,习惯了,一个人钻研。

当一切开始成为了定式,总觉得生活变的简单。有一些人羡慕我,觉得我有很好的环境学技术。

但是我现在也不觉得我有什么好自满的东西。不过是个再普通不过的走在技术道路上的菜鸟。

心里有千万般的无奈,心里有数不清的彷徨。

我渴望曾经的激情。

其实我也不想说那么多,耽误看帖人的时间,但是心里总有些不吐不快。

师兄总是开玩笑的说我现在开始“淡定了”。

朋友们也觉得我越来越“沉默了”。

现在也不敢想以后会成什么样子,一切都未知。

我不想到了以后“生无可恋,死无可依”(这是一个老程序员的感悟)。

但是我不能停止,停止就是倒退。

好啦,不罗嗦了,下面是我的程序:

 

<!---->#include<iostream> 
#define MAXVALUE 100000
using namespace std;
const int n=4;//叶子节点个数 
//构造哈夫曼树结点 
typedef struct{
int weight;//权值 
int parent;//父节点 
int lchild;//左子树 
int rchild;//右子树 
}HNodeType;

HNodeType HFMTree[
2*n-1];//结点数 

//构造哈夫曼编码数组
typedef struct{
int bit[n];
int start;
}HCodeType;

HCodeType HFMCode[n];
//创建哈夫曼树 
void createHFMTree(HNodeType HFMTree[],int n){
int m1,x1,m2,x2;
int i,j;
//初始化
for(i=0;i<2*n-1;i++){
   HFMTree[i].weight
=0;
   HFMTree[i].parent
=-1;
   HFMTree[i].lchild
=-1;
   HFMTree[i].rchild
=-1;
}
cout
<<"请输入结点权值:"<<endl; 
for(i=0;i<n;i++){                
   cin
>>HFMTree[i].weight;
}
for(i=0;i<n-1;i++){
   x1
=x2=MAXVALUE;
   m1
=m2=0;
   
for(j=0;j<n+i;j++){
    
if(HFMTree[j].parent==-1&&HFMTree[j].weight<x1){
     x2
=x1;
     m2
=m1;
     x1
=HFMTree[j].weight;
     m1
=j;
    }
    
else if(HFMTree[j].parent==-1&&HFMTree[j].weight<x2){
     x2
=HFMTree[j].weight;
     m2
=j;
    }
   }
   HFMTree[m1].parent
=n+i;HFMTree[m2].parent=n+i;
   HFMTree[n
+i].weight=HFMTree[m1].weight+HFMTree[m2].weight;
   HFMTree[n
+i].lchild=m1;
   HFMTree[n
+i].rchild=m2;
}
}
//转化编码 
void createHFMCode(HNodeType HFMTree[],HCodeType HFMCode[]){
HCodeType cd;
int i,j,c,p;
for(i=0;i<n;i++){
   cd.start
=n-1;
   c
=i;
   p
=HFMTree[c].parent;
   
while(p!=-1)
   {
    
if(HFMTree[p].lchild==c)cd.bit[cd.start]=0;
    
else cd.bit[cd.start]=1;
    cd.start
--;
    c
=p;
    p
=HFMTree[c].parent;
   }
   
for(j=cd.start+1;j<n;j++)
    HFMCode[i].bit[j]
=cd.bit[j];
   HFMCode[i].start
=cd.start+1;
}
}
//主函数 
int main()
{
int i,j;
//创建树 
createHFMTree(HFMTree,n);
//转码 
createHFMCode(HFMTree,HFMCode);
cout
<<endl;
for(i=0;i<n;i++)
{
   
for(j=HFMCode[i].start;j<=n-1;j++)
   {
    cout
<<HFMCode[i].bit[j];
   }
   cout
<<endl;
}
return 0;
}

 

这个是雏形,下面我们要实现的功能是,输入一个含有N位A,B,C,D四种字母的字符串。

然后转换成只含有0,1的代码串。之所以要使用哈夫曼树是因为哈夫曼树是最优树。根据权值来实现最短编码。

下面是实现自动转码的程序:

 

<!---->#include<iostream> 
#define MAXVALUE 100000
using namespace std;
const int n=4;//叶子节点个数 
string l;
int size;
//构造哈夫曼树结点 
typedef struct{
int weight;//权值 
int parent;//父节点 
int lchild;//左子树 
int rchild;//右子树 
}HNodeType;

HNodeType HFMTree[
2*n-1];//结点数 

//构造哈夫曼编码数组
typedef struct{
int bit[n];
int start;
}HCodeType;

HCodeType HFMCode[n];
//创建哈夫曼树 
void createHFMTree(HNodeType HFMTree[],int n){
int m1,x1,m2,x2;
int i,j;
//初始化
for(i=0;i<2*n-1;i++){
   HFMTree[i].weight
=0;
   HFMTree[i].parent
=-1;
   HFMTree[i].lchild
=-1;
   HFMTree[i].rchild
=-1;
}
cout
<<"*******************哈夫曼树字符串最优转码程序***********************"<<endl; 
cout
<<"请输入一个字符串:(只含有A,B,C,D四种字符,输入回车结束)"<<endl; 
cin
>>l;
std::
string str(l);
  size
=str.size();    
  
for(int i=0;i<size;++i){   
   
if(str.at(i)=='A')HFMTree[0].weight++;
   
else if(str.at(i)=='B')HFMTree[1].weight++;
   
else if(str.at(i)=='C')HFMTree[2].weight++;
   
else if(str.at(i)=='D')HFMTree[3].weight++;
   
else
   cout
<<"输入有误!"<<endl;
   
break;
   }
}

for(i=0;i<n-1;i++){
   x1
=x2=MAXVALUE;
   m1
=m2=0;
   
for(j=0;j<n+i;j++){
    
if(HFMTree[j].parent==-1&&HFMTree[j].weight<x1){
     x2
=x1;
     m2
=m1;
     x1
=HFMTree[j].weight;
     m1
=j;
    }
    
else if(HFMTree[j].parent==-1&&HFMTree[j].weight<x2){
     x2
=HFMTree[j].weight;
     m2
=j;
    }
   }
   HFMTree[m1].parent
=n+i;HFMTree[m2].parent=n+i;
   HFMTree[n
+i].weight=HFMTree[m1].weight+HFMTree[m2].weight;
   HFMTree[n
+i].lchild=m1;
   HFMTree[n
+i].rchild=m2;
}
}
//转化编码 
void createHFMCode(HNodeType HFMTree[],HCodeType HFMCode[]){
HCodeType cd;
int i,j,c,p;
for(i=0;i<n;i++){
   cd.start
=n-1;
   c
=i;
   p
=HFMTree[c].parent;
   
while(p!=-1)
   {
    
if(HFMTree[p].lchild==c)cd.bit[cd.start]=0;
    
else cd.bit[cd.start]=1;
    cd.start
--;
    c
=p;
    p
=HFMTree[c].parent;
   }
   
for(j=cd.start+1;j<n;j++)
    HFMCode[i].bit[j]
=cd.bit[j];
   HFMCode[i].start
=cd.start+1;
}
}
//主函数 
int main()
{
int i,j;
//创建树 
createHFMTree(HFMTree,n);
//转码 
createHFMCode(HFMTree,HFMCode);
cout
<<endl;
int k=65;
for(i=0;i<n;i++)
{
   cout
<<(char)k<<"的编码:";
   
for(j=HFMCode[i].start;j<=n-1;j++)
   {
    cout
<<HFMCode[i].bit[j];
   }
   k
++;
   cout
<<endl;
}
cout
<<"转码后的字符串为:"<<endl;
std::
string str(l);
  size
=str.size();    
  
for(int i=0;i<size;++i){   
   
if(str.at(i)=='A'){
   
for(j=HFMCode[0].start;j<=n-1;j++)
   cout
<<HFMCode[0].bit[j];
   }
   
else if(str.at(i)=='B'){
   
for(j=HFMCode[1].start;j<=n-1;j++)
   cout
<<HFMCode[1].bit[j];
   }
   
else if(str.at(i)=='C'){
   
for(j=HFMCode[2].start;j<=n-1;j++)
   cout
<<HFMCode[2].bit[j];
   }
   
else if(str.at(i)=='D'){
   
for(j=HFMCode[3].start;j<=n-1;j++)
   cout
<<HFMCode[3].bit[j];
   }
   
else
   cout
<<"输入有误!"<<endl;
   
break;
   }
}
return 0;
}

 

程序本机测试通过,可以放心运行!

转载注明:www.cnblogs.com/shiyangxt

 

分享到:
评论

相关推荐

    哈夫曼树压缩算法实现

    它是基于贪心策略的一种数据结构,用于构建一种特殊的二叉树,使得带权路径长度最短,从而达到编码效率最高。哈夫曼树的核心思想是通过频率排序构建最小带权路径长度的二叉树,以此为基础实现数据的高效压缩。 压缩...

    数据结构 堆结构的完整源码与哈夫曼树的构造

    在这个主题中,堆结构和哈夫曼树是两种重要的数据结构,广泛应用于优化算法和解决实际问题。 堆是一种特殊的树形数据结构,它满足堆属性:在最大堆中,每个节点的值都大于或等于其子节点的值;在最小堆中,每个节点...

    哈夫曼树源码实验报告

    哈夫曼树,又称最优二叉树,是数据压缩领域的一种基础数据结构,因其在构建过程中遵循了“最小带权路径长度”(Minimum Spanning Tree, MST)的原则,故能有效地进行编码,提高数据存储和传输的效率。在这个实验报告...

    数据结构试验 哈夫曼树的创建及编码 学生模板.rar

    在数据结构课程中,学习如何构建哈夫曼树并进行编码是基础且关键的环节。下面将详细介绍哈夫曼树的创建过程以及其编码原理。 一、哈夫曼树的构造 1. 哈夫曼树的定义:哈夫曼树(Huffman Tree),又称为最优二叉树...

    java 哈夫曼树及哈夫曼树的应用

    总的来说,哈夫曼树是一种高效的数据结构,对于理解和实现数据压缩算法具有重要意义。在Java中,我们可以利用数据结构和算法的知识,结合源码和工具,实现哈夫曼编码和解码的过程,从而提升程序在处理大量数据时的...

    数据结构与算法分析(C++版)第二版 随书源码

    《数据结构与算法分析(C++版)第二版》是由Mark Allen Weiss著,张铭译的一本经典教材,深入浅出地介绍了数据结构和算法分析的重要概念。这本书的随书源码提供了丰富的实例,帮助读者更好地理解和应用书中的理论...

    课设——哈夫曼树的源代码

    在VS2005环境下编写,源代码可能采用了C++语言,利用了STL库,例如`std::vector`或`std::queue`来实现数据结构和算法。在实际应用中,编码和解码可能涉及字节流的处理,包括读取和写入文件,这可能涉及到`fstream`类...

    数据结构课程设计 哈夫曼树编码解码 java javafx

    利用已建好的哈夫曼树(如不在内存,则从文件 hfmtree 中读入),对文件 tobetrans 中的正文进行编码,然后将结果存入文件 codefile 中。 (3)D:解码(Decoding)。利用已建好的哈夫曼树将文件 codefile 中的代码进行...

    数据结构与算法 python语言

    ### 数据结构与算法 Python语言知识点概述 #### 一、引言 - **基本概念**: 数据结构与算法的基础概念,包括问题求解过程、交叉路口通行问题等。 - **算法复杂性**: 包括时间复杂度和空间复杂度的介绍,以及如何在...

    同济大学数据结构课程设计,Qt可视化算法(哈夫曼树)和基于数据结构的QT应用(文本编辑器).zip

    1、该资源内项目代码都经过测试运行成功,功能ok的...适用工作项目、毕业设计,课程设计,项目源码均经过助教老师测试,运行无误,轻松复刻,欢迎下载 -------- 下载后请首先打开README.md文件(如有),仅供学习参考。

    sy3new_哈夫曼树_源码

    基于哈夫曼树的数据压缩算法描述输入一串字符串,根据给定的字符串中字符出现的频率建立相应哈夫曼树,构造哈夫曼编码表,在此基础上可以对待压缩文件进行压缩(即编码),同时可以对压缩后的二进制编码文件进行解压...

    哈夫曼编码源码,用C语言实现,数据结构课程设计!

    哈夫曼编码是一种高效的数据压缩方法,源自于数据结构中的树形数据结构——哈夫曼树(Huffman Tree)。在信息理论中,哈夫曼编码是建立在一个字符出现频率基础上的变长编码方式,它使得频繁出现的字符拥有较短的编码...

    哈夫曼树生成程序(含源码)

    哈夫曼树是一种特殊的二叉树,也称为最优二叉树或最小带权路径长度树。在数据压缩、编码优化等领域有着广泛的应用。...同时,对于软件开发者来说,熟悉这样的程序也有助于提升对数据结构和算法的实际应用能力。

    哈夫曼树_C语言_

    哈夫曼树是一种数据结构,常用于数据压缩和编码,特别是在通信系统中,它能有效提高数据传输效率。本文将详细介绍哈夫曼树的概念、构建过程以及C语言实现的细节。 哈夫曼树,又称为最优二叉树或最小带权路径长度树...

    哈夫曼树实现的程序源代码

    总的来说,哈夫曼树是数据压缩的重要工具,其程序源代码涉及了数据结构、算法以及编码理论等多个方面的知识。理解并实现哈夫曼树的编码和解码,对于提升数据压缩效率和理解压缩原理都至关重要。通过分析和运行提供的...

    精选_毕业设计_基于JAVA实现的Huffman哈夫曼树编码与解码_完整源码

    本项目“精选_毕业设计_基于JAVA实现的Huffman哈夫曼树编码与解码_完整源码”是用Java语言实现的,它涵盖了哈夫曼编码的构建、编码和解码过程。下面我们将深入探讨哈夫曼编码的基本原理以及如何用Java进行实现。 ...

    哈夫曼树及哈夫曼编码的实现(java)

    总结来说,哈夫曼树和哈夫曼编码的Java实现涉及了数据结构、算法和文件处理等多个方面,对于提升编程技能和理解数据压缩原理具有重要意义。通过阅读和分析这些源代码,我们可以深入理解哈夫曼编码的工作原理,并能将...

    (完整word版)数据结构课设报告+哈夫曼编译器+C语言+源码.doc

    数据结构课程设计报告主要关注的是实现一个哈夫曼编译器,该编译器使用C语言编写,并包含源码。哈夫曼编码是一种高效的前缀编码方法,常用于数据压缩,尤其是在文本文件处理中。本报告的目标是设计并实现一个能够...

    数据结构课设报告哈夫曼编译器C语言源码.docx

    数据结构作为计算机专业的重要课程之一,旨在为计算机科学提供坚实的算法理论基础和软件设计技术支撑。通过课程设计这一实践环节,旨在提升学生的实际编程能力和解决实际问题的能力。本次课程设计的目标是让学生掌握...

    数据结构与算法全集(C源代码+详细注释)

    全集内容结构如下: ├─图 │ ├─关键路径(有向无环图及其应用2) │ │ 1.txt │ │ ALGraph.cpp │ │ ALGraph.h │ │ CriticalPath.cpp │ │ CriticalPath.h │ │ InfoType.cpp │ │ InfoType.h │ │ ...

Global site tag (gtag.js) - Google Analytics