HDOJ 1053 Huffman编码 自写优先队列的ADT 权当做练习数据结构
来源:互联网 发布:雕刻机编程软件有几种 编辑:程序博客网 时间:2024/04/28 17:46
//BinHeap.h#ifndef _BinHeap_Hstruct PriorityQueueNode;struct ElementTypeNode;typedef struct PriorityQueueNode PQN;typedef struct PriorityQueueNode *PriorityQueue;typedef struct ElementTypeNode ETN;typedef struct ElementTypeNode *ElementType;/*Methods of Priority Queue*/PriorityQueue Initialize(int MaxElements);int IsEmpty(PriorityQueue H);int IsFull(PriorityQueue H);/*Warning Type ETN has not been complete*/void Insert(ETN X, PriorityQueue H);ETN DeleteMin(PriorityQueue H);void Destroy(PriorityQueue H);#endif
//BinHeap.c#include <stdio.h>#include "BinHeap.h"#define MinPQSize 1#define IrrelevantWord '#'#define MinKey 0#define Bin 2struct PriorityQueueNode{int Capacity;int Size;ElementType Elements;};struct ElementTypeNode{char Word;int Key;};PriorityQueue Initialize(int MaxElements){PriorityQueue H;if(MaxElements < MinPQSize)printf("Size Error!PQ size is too small!\n");H = malloc(sizeof(struct PriorityQueueNode));if(H == NULL)printf("H Malloc Error!\n");/*Allocate the array plus one extra for sentinel*/H->Elements = malloc( (MaxElements + 1) * sizeof(struct ElementTypeNode));if(H->Elements == NULL)printf("H->Elements Malloc Error!\n");H->Capacity = MaxElements;H->Size = 0;H->Elements[0].Word = IrrelevantWord;H->Elements[0].Key = MinKey;return H;}void Destroy(PriorityQueue H){free(H->Elements);free(H);}int IsFull(PriorityQueue H){if(H->Size == H->Capacity) return 1;elsereturn 0;}int IsEmpty(PriorityQueue H){if(H->Size == 0)return 1;else return 0;}void Insert(ETN X, PriorityQueue H){int i;if( IsFull(H) ){printf("Priority Queue is full!\n");return ;}for(i = ++ H->Size; H->Elements[i/Bin].Key > X.Key; i/=Bin){H->Elements[i] = H->Elements[i/Bin];}H->Elements[i] = X;}ETN DeleteMin(PriorityQueue H){int i,Child;ETN MinElement,LastElement;if( IsEmpty(H)){printf("PQ is empty!\n");return H->Elements[0];}MinElement = H->Elements[1];LastElement = H->Elements[H->Size--];for(i = 1;i * 2 <= H->Size; i = Child){Child = i * 2;if(Child != H->Size && H->Elements[Child + 1].Key < H->Elements[Child].Key) Child++;if(LastElement.Key > H->Elements[Child].Key)H->Elements[i] = H->Elements[Child];elsebreak;}H->Elements[i] = LastElement;return MinElement;}
//HuffCode.c#include "BinHeap.c"#include <string.h>#define CharacterTypes 27#define CharacterLen 100#define CharacterEnd "END"#define StandardCharacterLength 8int HuffCodeLength(PriorityQueue H){int Length = 0;ETN Tmp1,Tmp2;if(H->Size <= 0)return Length;if(H->Size == 1)return Length + 1;while(H->Size > 1){Tmp1 = DeleteMin(H);Tmp2 = DeleteMin(H);Length += (Tmp1.Key + Tmp2.Key);Tmp1.Key += Tmp2.Key;Insert(Tmp1,H);}DeleteMin(H);return Length;}int main(){char TheString[CharacterLen];char Characters[CharacterTypes];PriorityQueue H;ETN Tmp;int i,StandardResult,HuffCodeResult;H = Initialize(CharacterLen);while(1){gets(TheString);if( strcmp(CharacterEnd,TheString) == 0)break;for(i = 0; i < CharacterTypes; i++)Characters[i] = 0;/*for(i = 0; i < strlen(TheString); i++)printf("%c",TheString[i]);printf("\n");*/for(i = 0; i < strlen(TheString); i++){if(TheString[i] == '_')Characters[CharacterTypes-1]++;elseCharacters[TheString[i]-'A']++;}/*for(i = 0; i < CharacterTypes; i++){printf("%d ",Characters[i]);}printf("\n");*/for(i = 0; (i < CharacterTypes); i++) { if( Characters[i] <= 0 ) continue; Tmp.Word = (char)('A' + i); Tmp.Key = Characters[i]; Insert(Tmp,H); } StandardResult = StandardCharacterLength * strlen(TheString); /*Huffman Code Len*/ HuffCodeResult = HuffCodeLength(H); printf("%d %d %.1f\n",StandardResult,HuffCodeResult,(float)StandardResult/HuffCodeResult); /**************/ }Destroy(H);return 0;}
并没有具体实现Huffman Tree,直接计算了HuffmanCode的长度。
0 0
- HDOJ 1053 Huffman编码 自写优先队列的ADT 权当做练习数据结构
- 用优先队列的huffman编码实现
- HDU 1053 Entropy 【优先队列+Huffman编码】
- Huffman编码优先队列实现
- Huffman 编码 + 优先队列【算法+数据作业题】
- hdoj 1053 Entropy 【huffman编码】
- poj1521 (huffman +优先队列)
- huffman 优先队列
- 由Huffman编码以及相关的数据结构
- Huffman编码(数据结构)
- 数据结构 树 Huffman编码
- Huffman 编码 数据结构
- 【数据结构】huffman编码
- 【数据结构】Huffman编码
- 数据结构Huffman编码译码
- 数据结构 Huffman编码实现
- 优先队列实现Huffman树
- Sicily Huffman coding | 优先队列
- 随机森林的视觉应用-Regression Forests (2)
- 接入广告App 教你如何赚取你的第一桶金 - 2048(含源码)
- C# 安装程序制作,如何添加第三方DLL以及自定义的文件夹(如uploadFiles 文件夹)
- Could not write to output file 'c:\WINDOWS\Microsoft.NET\Framework\..dll-拒绝访问
- VLC源码分析二
- HDOJ 1053 Huffman编码 自写优先队列的ADT 权当做练习数据结构
- VS中的路径宏
- 写给喜欢数据分析的初学者
- iOS开发的一些奇巧淫技
- 数据库的关系键
- Java基础----第一个Thread
- Note
- 无线路由高级设置 虚拟服务器及DMZ主机
- MySQL字符集设置