데이터 구조 Huffman 인 코딩 디 코딩

1. 수요 분석
 1.1 문제 설명
•          문제 설명: 하프 만 인 코딩 을 이용 하여 통신 을 하면 채널 이 용 률 을 크게 높 일 수 있 고 정보 전송 시간 을 단축 시 켜 전송 원 가 를 낮 출 수 있다.그러나 이 는 송신 단 에서 하나의 인 코딩 시스템 을 통 해 전 송 된 데 이 터 를 미리 인 코딩 하고 수신 단 에서 전 송 된 데 이 터 를 디 코딩 (디 코딩) 해 야 한다.양 방향 채널 (즉, 양 방향 으로 정 보 를 전송 할 수 있 는 채널) 에 대해 모든 엔 드 는 완전한 편집 / 디 코딩 시스템 이 필요 하 다.이러한 정보 송 수신 소 를 위해 하 프 만 컴 파일 코드 시스템 을 설계 해 보 세 요.
 
 1.2 기본 요구 사항
 (1) 입력 의 형식 과 입력 값 의 범위;
 (2) 출력 형식;
 (3) 프로그램 이 달성 할 수 있 는 기능.
1. 기본 요구
(1) 초기 화 (Initialzation).데이터 파일 DataFile. data 에서 문자 와 모든 문자 의 가중치 를 읽 고 하프 만 트 리 HuffTree 를 만 듭 니 다.
(2) 인 코딩 (EnCoding).만들어 진 하프 만 트 리 로 파일 ToBeTran. data 의 텍스트 를 인 코딩 하여 메 시 지 를 만 들 고 메 시 지 를 파일 Code. txt 에 쓰기;
(3) 디 코딩 (Decoding).만들어 진 하프 만 트 리 를 이용 하여 파일 CodeFile. data 의 코드 를 디 코딩 하여 원문 을 만 든 결과 파일 Textfile. txt 에 저장 합 니 다.
(4) 출력 (Output).DataFile. data 에 나타 난 문자 와 각 문자 가 나타 나 는 빈도 (또는 확률) 를 출력 합 니 다.ToBeTran. data 와 그 메시지 Code. txt 를 출력 합 니 다.CodeFile. data 와 그 원문 Textfile. txt 를 출력 합 니 다.
 
2. 개요 설계
이 프로그램 에서 사용 하 는 모든 추상 적 인 데이터 형식의 정 의 를 설명 합 니 다.주 프로그램의 절차 와 각 프로그램 모듈 간 의 차원 (호출) 관계. 
(1) 데이터 구조 
하프 만 나무의 노드
struct huff
{
    intweight;
    intparent;
    intl;
    intr;
};
하프 만 인 코딩 저장 소
struct huff *hufftree;
 
(2) 프로그램 모듈
1 부터 i - 1 까지 parent 가 0 이 고 가중치 가 가장 작은 두 개의 하 표를 선택 하 십시오.
void Select(struct huff *HT, int n, int&s1, int &s2)
하프 만 트 리 구축:
void huffmancoding(struct huff *ht,int *w,intn)
원문 인 코딩:
void code(char *c)
메시지 에 따라 원문 찾기:
void decoding(char *zifu)
3. 상세 설계
    핵심 기술 분석:
1: 하프 만 트 리 구축 및 하프 만 인 코딩 생 성:
 모든 문자 의 가중치 에 따라 최 적 화 된 이 진 트 리 의 구축 방법 에 따라 하 프 만 트 리 를 재 귀적 으로 생 성하 고 하 프 만 트 리 를 배열 로 저장 합 니 다.
모든 잎 노드 에서 나무 뿌리 를 옮 겨 다 니 며 인 코딩 을 구하 십시오.
예 를 들 면:
그림 에서 보 듯 이 네 개의 노드 v1, v2, v3, v4 는 그들의 가중치 가 각각 7, 11, 4, 5 이다.
       7          11         4         5
 
 
첫 번 째 단계: 두 개의 가중치 가 가장 작은 노드 를 좌우 자식 으로 선택 하고 이 진 트 리 를 만 듭 니 다. 부모 의 가중치 는 두 아이의 합 입 니 다. 그림 과 같 습 니 다.
     7           11         9
 
 
 
 
 
첫 번 째 단계 반복:
             11                    16
 
 
 
 
 
 
 
 
                              27
첫 번 째 단계 반복:
                    16
 
 
 
 
 
 
 
 
이때 만들어 진 것 은 이 진 트 리 입 니 다. 왼쪽 트 리 의 인 코딩 을 1 로 정 하고 오른쪽 트 리 의 인 코딩 을 0 으로 정 하면 이 진 트 리 를 인 코딩 할 수 있 습 니 다. 그림 과 같 습 니 다.
 
 
 
                    
                   1            0
 
                               1             0
 
 
 
                                          1           0
 
 
 
각 정점 의 인 코딩 은:
V1  01
V2  1
V3  001
V4  000
2: 원문 인 코딩:
파일 에서 문 자 를 하나씩 읽 고 만들어 진 하 프 만 트 리 에 따라 모든 문자 에 해당 하 는 인 코딩 을 찾 습 니 다.
3: 메시지 디 코딩:
단계 1:
일치 하 는 문자열 을 먼저 읽 고 저장 합 니 다.
단계 2:
일치 하 는 문자열 에 따라 모든 하프 만 인 코딩 을 찾 습 니 다. 해당 하 는 인 코딩 을 찾 으 면 해당 하 는 문 자 를 입력 하 십시오. 찾 지 못 하면 두 문 자 를 읽 고 일치 하 는 문자열 에 저장 하고 두 번 째 단 계 를 반복 합 니 다. 찾 을 때 까지.
단계 3:
나머지 문 자 를 반복 합 니 다. 하나, 둘.
#include
#include
#include
struct huff
{
    int weight;
    int parent;
    int l;
    int r;
};
int mm;/*          */
struct huff *hufftree;
char **huffmancode;
void Select(struct huff *HT, int n, int &s1, int &s2)//    ,  parent  ,          
{
 int min1=100;
 int min2=100;
 int i;
 for(i=1;i<=n;i++)
        if((min1>HT[i].weight)&&(HT[i].parent==0))
        min1=HT[i].weight;
    for(i=1;i<=n;i++)
    if((min1==HT[i].weight)&&(HT[i].parent==0))
    {
        s1=i;
        break;
    }
    for(i=1;i<=n;i++)
        if((min2>HT[i].weight)&&(HT[i].parent==0)&&(i!=s1))
        min2=HT[i].weight;
    for(i=1;i<=n;i++)
    if((min2==HT[i].weight)&&(HT[i].parent==0)&&(i!=s1))
    {
        s2=i;
        break;
    }
}
int pipei(char *c)/* huffmancode       */
{
    int i;
    for(i=1;iweight=*w;
        p->parent=0;
        p->l=0;
        p->r=0;
    }
    for(;i<=m;i++,p++)
    {
        p->l=0;
        p->weight=0;
        p->parent=0;
        p->r=0;
            }
    for(i=1;i<=4;i++)
    for(i=n+1;i<=m;i++)
    {
        int s1,s2;
        Select(ht,i-1,s1,s2);
        ht[s1].parent=i;
        ht[s2].parent=i;
        ht[i].l=s1;
        ht[i].r=s2;
        ht[i].weight=ht[s1].weight+ht[s2].weight;
    }

    char *cd;
    cd=(char *)malloc(n*sizeof(char));
    cd[n-1]='\0';
    int start,c,f;
    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].l==c)
            cd[--start]='0';
        else
            cd[--start]='1';
            huffmancode[i]=(char *)malloc((n-start)*sizeof(char));
            strcpy(huffmancode[i],&cd[start]);
    }
     free(cd);
}

좋은 웹페이지 즐겨찾기