哈夫曼树的构造
来源:互联网 发布:爱奇艺视频软件 编辑:程序博客网 时间:2024/05/29 12:30
Huffman_encoding (s,f)
input:s(字符串)和f(字频数组)
output:T(S的哈夫曼树)
begin:
insert all characters into a heap H according to their frequncy
while H is not empty do
if H contains only only character X then
make X the root of T
else
pick two characters X and Y with lowest frequencies
and delete them from h;
replace X and Y with a new character Z whose frequency is
the sum of the frequencies of X and Y
insert Z to H
make X and Y children of Z in T
end
代码如下:题意如下:6个字符A B C D E F,其字频分别为 5 2 3 4 10 1 它们的哈夫树的构造。
代码:
// 哈弗曼编码.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>using namespace std;int K =0;//当前堆的大小 从0开始的class NODE{public: NODE *left; NODE *right; int value;bool operator<(const NODE &other)const//按x排序的时候能用到 { return value<other.value; } const NODE& operator=(NODE &b){left=b.left;right=b.right;value=b.value;return *this;}bool operator==(NODE &b){return value==b.value;}};void build_heap(NODE arr[],int n,NODE x)//建最小堆{arr[n]=x;NODE tmp=x;if(n==0){cout<<"n--"<<n<<"----";cout<<tmp.value<<endl;return;}while(n>0){if(tmp<arr[((n+1)/2)-1]){ arr[n]=arr[((n+1)/2)-1];n=((n+1)/2)-1;}else break;}if(n>=0)arr[n]=tmp;cout<<"n--"<<n<<"----";cout<<tmp.value<<endl;}void delete_heap_1(NODE arr[],NODE x)//调整从堆顶元素{int j;NODE t;arr[0]=x;int i=0;while(i<K)//还有孩子{j=2*i+1;if(j>=K) break;if((arr[j+1]<arr[j])&&(j+1<K)) j=j+1;//if((arr[i]<arr[j])||(arr[i]==arr[j])) break;if(arr[j]<arr[i]){t=arr[j];arr[j]=arr[i];arr[i]=t;i=j;}else break;}}int _tmain(int argc, _TCHAR* argv[]){NODE node[6];NODE arr[20];int i;for(i=0;i<20;i++){arr[i].left=NULL;arr[i].right=NULL;arr[i].value=-1;}for(i=0;i<6;i++){node[i].left=NULL;node[i].right=NULL;}node[0].value=5;node[1].value=2;node[2].value=3;node[3].value=4;node[4].value=10;node[5].value=1;for(i=0;i<6;i++)build_heap(arr,i,node[i]);K=5;/*for(i=5;i>=0;i--){cout<<"----------"<<endl;cout<<arr[0].value<<endl;delete_heap_1(arr,arr[i]);K--;}*/cout<<arr[0].value<<endl;NODE *root=new NODE();root->right=NULL;root->right=NULL;root->value=-1;while(K>=0){if(K==0)//只有一个元素{root=&arr[0];break;}else{NODE x;x=arr[0];cout<<endl<<endl;cout<<"x----"<<x.value<<endl;delete_heap_1(arr,arr[K]);K--;NODE y;y=arr[0];delete_heap_1(arr,arr[K]);K--;cout<<"y----"<<y.value<<endl;NODE z;z.left=&x;z.right=&y;z.value=x.value+y.value;cout<<"z---"<<z.value<<endl;cout<<endl<<endl;K++;build_heap(arr,K,z);}}cout<<"value=="<<root->value<<endl;return 0;}
- 哈夫曼树的构造
- 哈夫曼树的构造
- 哈夫曼树的构造
- 哈夫曼树的构造
- 哈夫曼树的构造算法
- 构造哈夫曼树的算法
- 哈夫曼树的构造
- 哈夫曼树的构造
- 哈夫曼树的构造
- 哈夫曼树的构造
- 哈夫曼树的构造过程
- 哈夫曼树的构造,编码,译码
- 哈夫曼树的构造以及编码
- 哈夫曼树的构造(转载)
- 哈夫曼树的构造(转载)
- 哈夫曼树的构造(转载)
- 哈夫曼树的构造-C语言
- 哈夫曼树的构造和编码
- Struts2异常处理机制
- 黑马程序员---集合一
- 大型网站架构演化一些关键点
- C++代码风格01
- SparK安装
- 哈夫曼树的构造
- 整数取反
- 100句永久珍藏的人生格言
- 千万别用MongoDB?真的吗?!
- C++ 把struct 当作类试用
- junit中 assertEquals与assertSame用法的区别
- 基于2440PWM定时器程序
- 广告语
- 使用httpPost和httpGet出现的bug