9068:哈夫曼编码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39993896/article/details/84500637

 Problem Description

由若干个值无重复的结点及其权值,建立相应的哈夫曼树。在合并过程中,若出现权值相同的情况,则优先选取编号小的进行合并;要求哈夫曼树中所有左孩子编号小于右孩子编号(以结点的输入顺序做为其编号)。对所建的哈夫曼树,根据左0右1的原则,对各结点进行编码。设计一个算法,对给定的若干码串进行相应的解码,并输出解码结果。

 Input

有多组测试数据,每组数据由结点信息和码串两部分组成。结点信息部分的第一行为一个整数n(n<=20),表示以下有n个结点信息,每个结点信息包括一个字符和一个整数,表示结点值和权值;码串部分的第一行为一个整数m,表示以下有m个码串(每个串长不超过100),码串由0和1构成,且均有效。

 Output

输出各码串对应的解码结果,每个解码结果占一行,每组测试数据后有一空行。

 Sample Input

4
A7
G5
O2
D4
2
10110110111
11111010

 Sample Output

GOOD
DOG


#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

struct node {
    int parent;
    int lchild,rchild;
    int weight;
};

class Stack {
public :
    int top;
    char data[101];
public:
    Stack() {
        top=-1;
    }
    void Push(char ch) {
        data[++top]=ch;
    }
    char* ToArray() {
        char* temp=new char[top+1];
        for(int i=0; i<strlen(temp); i++) {
            temp[i]=data[top--];
        }
        for(int i=0; i<strlen(temp); i++) {
            cout<<temp[i];
        }
        cout<<endl;
        return temp;
    }

};


node* array;
int select_min(int n) {

    int minIndex;
    for(int i=0; i<2*n-1; i++) {
        if(array[i].parent==-1&&array[i].weight!=0) {
            minIndex=i;
            break;
        }
    }
    for(int i=0; i<2*n-1; i++) {
        if(array[i].parent==-1&&array[i].weight!=0) {
            if(array[i].weight<array[minIndex].weight)
                minIndex=i;
        }
    }
    array[minIndex].parent=1;
    return minIndex;
}

void CreatHuffman(int *w,int n) {
    for(int i=0; i<2*n-1; i++) {
        array[i].parent=-1;
        array[i].lchild=-1;
        array[i].rchild=-1;
        array[i].weight=w[i];
    }
    for(int j=n; j<2*n-1; j++) {
        int min_lchild=select_min(n);
        int min_rchild=select_min(n);
        array[j].lchild=min_lchild;
        array[j].rchild=min_rchild;
        array[j].weight=array[min_lchild].weight+array[min_rchild].weight;
        array[min_lchild].parent=j;
        array[min_rchild].parent=j;
    }

}
Stack *s;
char** preFix;
int pre_len[101];
void PreFix(int n) {

    s=new Stack[n];

    for(int child=0; child<n; child++) {
        int temp=child;
        int flag;
        for(int i=n; i<2*n-1; i++) {
            flag=0;
            if(array[i].lchild==temp) {
                s[child].Push('0');
                flag=1;
            }
            if(array[i].rchild==temp) {
                s[child].Push('1');
                flag=1;
            }
            if(flag) {
                temp=i;
            }
        }
    }
}

void toArray(Stack* s,int n) {
    preFix=new char*[n];

    for(int i=0; i<n; i++) {
        int c=s[i].top;
        pre_len[i]=c+1;

        preFix[i]=new char[c+1];
        for(int k=0; k<c+1; k++) {
            preFix[i][k]=s[i].data[s[i].top--];
        }
    }
}


void Match(char* str,int n,char* character) {
    int len=strlen(str);
    int j=0;
    int p=0;


    for(int i=0; i<len; ) {
        while(j<n) {
            if(p==pre_len[j]) {
                cout<<character[j];
                p=0;
                j=0;
            } else if(preFix[j][p]==str[i]) {
                {
                    p++;
                    i++;
                }
            } else if(i==len) {
                break;
            } else {
                j++;
                i-=p;
                p=0;
            }

        }
    }


}


int main() {

    int n;

    while(cin>>n) {
        char* character=new char[n];
        int *weight=new int[2*n-1];
        array=new node[2*n-1];
        for(int i=0; i<n; i++) {
            cin>>character[i]>>weight[i];
        }
        for(int j=n; j<2*n-1; j++) {
            weight[j]=0;
        }
        CreatHuffman(weight,n);
        int m;
        cin>>m;
        char str[101];
        for(int k=0; k<m; k++) {
            cin>>str;

            PreFix(n);

            toArray(s,n);

            Match(str,n,character);
            cout<<endl;
        }
        cout<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39993896/article/details/84500637
今日推荐