데이터 구조 - 하프 만 트 리 및 하프 만 인 코딩 코드 구현
2752 단어 데이터 구조
#define MAXLEAFNUM 50 //
typedef struct node{
char ch;//
int weight;//
int parent;// , 0
int lChild,rChild;// , 0
}HuffmanTree[2*MAXLEAFNUM];
typedef char* HuffmanCode[MAXLEAFNUM + 1];
void select(HuffmanTree HT,int n,int &s1,int &s2)
{
s1 = 1;
s2 = 2;
int nMinW = HT[1].weight;
for(int i = 1; i <= n;i++){
if(HT[i].parent != 0){
continue;
}
if(nMinW > HT[i].weight){
nMinW = HT[i].weight;
s1 = i;
}
}
if(s1 != 1){
nMinW = HT[1].weight;
}else{
nMinW = HT[2].weight;
}
for(int i = 1; i <= n -1;i++){
if(HT[i].parent != 0 || i == s1){
continue;
}
if(nMinW > HT[i].weight){
nMinW = HT[i].weight;
s2 = i;
}
}
}
//
void createHTree(HuffmanTree HT,char *c,int *w,int n)
{
int i,s1,s2;
if(n <= 1){
return;
}
for(i = 1; i <= n;i++){// n
HT[i].ch = c[i - 1];
HT[i].weight = w[i - 1];
HT[i].parent = HT[i].lChild = HT[i].rChild = 0;
}
for(;i < 2 * n;i++){
HT[i].parent = HT[i].lChild = HT[i].rChild = 0;
}
for(i = n + 1; i < 2 *n; i++){
select(HT,i - 1,s1,s2);
HT[s1].parent = i;
HT[s2].parent = i;
HT[i].lChild = s1;
HT[i].rChild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
}
}
// , ,
//n HT 1~n, i(1<= i <= n) HC[i]
void HuffmanCoding(HuffmanTree HT,HuffmanCode HC,int n)
{
char *cd;
int i,start,c,f;
if(n <= 1){
return;
}
cd = (char*)malloc( n * sizeof(char));//
cd[n -1] = '\0';//
for(i = 1; i <= n;i++){
start = n - 1;
for(c = i,f = HT[i].parent;f != 0;c = f,f = HT[f].parent){//
if(HT[f].lChild == c){// , 0, 1
cd[start] = '0';
}else{
cd[start] = '1';
}
start--;
}
HC[i] = (char*)malloc((n - start) * sizeof(char));
strcpy(HC[i],&cd[start]);
free(cd);
}
}
//
void Decoding(HuffmanTree HT,int n,char *buff)
{
int p = 2 * n - 1;
while (*buff) {
if((*buff) == '0'){
p = HT[p].lChild;
}else{
p = HT[p].rChild;
}
if(HT[p].lChild == 0 && HT[p].rChild == 0){
cout << HT[p].ch << endl;
p = 2 * n - 1;
}
buff++;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.