贪心算法-哈夫曼编码
哈夫曼编码
#include <iostream>
using namespace std;
typedef struct Node
{
int data;
int leftposition;
int rightposition;
}Node;
void Heap_Character(Node *data,int num,int start) //保持小根堆的性质函数
{
int left=start*2;
int right=start*2+1;
int smallest=start;
if(left<=num&&data[left].data<data[start].data)
smallest=left;
else
smallest=start;
if(right<=num&&data[right].data<data[smallest].data)
smallest=right;
if(smallest!=start)
{
int tempdata=data[start].data;
int templeftposition=data[start].leftposition;
int temprightposition=data[start].rightposition;
data[start].data=data[smallest].data;
data[start].leftposition=data[smallest].leftposition;
data[start].rightposition=data[smallest].rightposition;
data[smallest].data=tempdata;
data[smallest].leftposition=templeftposition;
data[smallest].rightposition=temprightposition;
Heap_Character(data,num,smallest);
}
}
void Built_Heap(Node *data,int num) //创建一个小根堆
{
for(int i=num/2;i>=1;i--)
Heap_Character(data,num,i);
}
void Haffman(Node *data,int num)
{
int rear=num;
while(num!=1)
{
//for(int i=1;i<=rear;i++) //打印结果
//cout<<data[i].data<<" ";
//cout<<endl;
int tempdata=data[num].data; //找到最小的节点,移置最后
int templeftposition=data[num].leftposition;
int temprightPosition=data[num].rightposition;
data[num].data=data[1].data;
data[num].leftposition=data[1].leftposition;
data[num].rightposition=data[1].rightposition;
data[1].data=tempdata;
data[1].leftposition=templeftposition;
data[1].rightposition=temprightPosition;
num--;
//for(int i=1;i<=rear;i++) //打印结果
//cout<<data[i].data<<" ";
//cout<<endl;
Heap_Character(data,num,1); //保持堆性质,以便于找到第二小的节点
rear++;
data[rear].data=data[1].data;
data[rear].leftposition=data[1].leftposition;
data[rear].rightposition=data[1].rightposition;
data[1].data=data[num+1].data+data[rear].data;
data[1].leftposition=num+1;
data[1].rightposition=rear;
//for(int i=1;i<=rear;i++) //打印结果
//cout<<data[i].data<<" ";
//cout<<endl<<data[1].leftposition<<" "<<data[1].rightposition<<endl;
//cout<<"The num is :"<<num<<endl;
Built_Heap(data,num);
}
//cout<<data[num].data;
}
void ProduceCode(Node *tree,int sum,int position,int *code)
{
if(tree[position].leftposition==-1&&tree[position].rightposition==-1)
{
cout<<tree[position].data<<" :";
for(int i=0;i<sum;i++)
cout<<code[i];
cout<<endl;
}
else
{
code[sum]=0;
ProduceCode(tree,sum+1,tree[position].leftposition,code);
code[sum]=1;
ProduceCode(tree,sum+1,tree[position].rightposition,code);
sum++;
}
}
int main()
{
int data[7]={0,45,13,12,16,9,5};
int num=6;
Node *tree=new Node[num*2];
for(int i=1;i<=num;i++)
{
tree[i].data=data[i];
tree[i].leftposition=-1;
tree[i].rightposition=-1;
}
for(int i=num+1;i<=num*2-1;i++)
{
tree[i].leftposition=-1;
tree[i].rightposition=-1;
}
Built_Heap(tree,num);
Haffman(tree,num);
cout<<"Code is below:"<<endl;
int code[10];
int sum=0;
ProduceCode(tree,sum,1,code);
return 0;
}
运行结果:

态度决定高度,细节决定成败,

浙公网安备 33010602011771号