하프 만 인 코딩 과 디 코딩
3809 단어 데이터 구조
title:
date: 2018-11-21 12:01:27
tags: [ ]
categories:
실험 2 하프 만 인 코딩 과 디 코딩
실험 목적
1. 이 진 트 리 의 순서 저장 구 조 를 잘 알 고 있다.
2. 이 진 트 리 의 순서 저장 구조 와 구체 적 인 실현 에 익숙 하 다.
3. 하 프 만 인 코딩 과 디 코딩 을 잘 알 고 순서 저장 구조 에서 의 실현
실험 요구:
1. 입력 에 따라 하프 만 나 무 를 구성 하고 이 하프 만 나무의 왼쪽 나 무 는 오른쪽 나무 보다 작 아야 한다.
2. 구조의 하 프 만 나무 에 따라 해당 하 는 인 코딩 을 한다.왼쪽 트 리 의 인 코딩 은 0 이 고 오른쪽 트 리 의 인 코딩 은 1 입 니 다.
3. 각 문자 에 대응 하 는 인 코딩 과 평균 인 코딩 길 이 를 출력 합 니 다.
4. 입력 한 인 코딩 에 따라 구조의 하 프 만 트 리 와 결합 하여 해당 하 는 디 코딩 을 제시한다.
5. 서로 다른 가중치 가 있 는 문 자 를 인 코딩 합 니 다.자신 이 실현 한 인 코딩 표를 사용 하여 입력 한 '0', '1' 코드 를 디 코딩 하 다.
데이터 입 출력 요구 사항
예제 입력
5
A 8
B 20
C 30
D 15
E 27
0101101110#
(설명: 첫 번 째 데이터 5 는 모두 5 개의 문 자 를 인 코딩 해 야 한 다 는 것 을 나타 내 고 뒤의 'A 8' 은 A 의 권 리 를 8 로 나타 내 며 문자 의 개 수 는 20 개 를 초과 하지 않 습 니 다. 데이터 0101101110 # 디 코딩 할 데이터 이 고 마지막 으로 # 로 끝 납 니 다)
출력 예시
인 코딩: A 010
B 00
C 11
D 011
E 10
평균 인 코딩 길이: 2.23
대응 하 는 디 코딩 은: ACDE
코드
#include
#include
#include
#include
#include
const int INF=0x3f3f3f3f;
using namespace std;
typedef struct
{
char ch; //
int weight; //
int parent, lchild, rchild; //
}HTNode, *HuffmanTree;
typedef char **HuffmanCode;
int Floor[25];
//
void CreateHuffmanTree(HuffmanTree &HT, int w[], char ch[], int n);// HuffmanTree
void Select(HuffmanTree HT, int n, int &s1, int &s2); //
void HTCoding(HuffmanTree HT, HuffmanCode &HC, int n); // HuffmanTree
void PrintCode(HuffmanCode HC, int n, char ch[]);//
double AverageLenght(HuffmanTree HT, HuffmanCode HC, int n); //
void DeCode(HuffmanTree HT, int n);//
int main()
{
int n;
int i;
char arrch[20];
int arrweight[20];
double avlength;
char ch;
HuffmanTree HT; //HT , HuffmanTree
HuffmanCode HC; //HC ,
scanf("%d",&n);//
while((ch=getchar())!='
');
if(n>20||n<2) exit(0); // ;
for(i=0;i0), HT,
int i, m,s1, s2;
m = 2 * n - 1;
HT = (HuffmanTree)malloc((m+1) * sizeof(HTNode)); // 0
// w[] , ch[]
for (i=1; i<=n; i++)
{
HT[i].weight=w[i-1];
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
HT[i].ch =ch[i-1];
}
// HT n-1
for (i=n+1; i<=m; i++)
{
HT[i].weight=0;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
HT[i].ch='\0';
}
for (i=n+1; i<=m; 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;
}
}
void Select(HuffmanTree HT, int n, int &s1, int &s2)
{ //
int t1=INF;
int t2=INF;
for(int i=1;i<=n;i++)
{
if(HT[i].parent==0)//
{
if(HT[i].weight
주의 하 다.
통계 층 수 는 전역 변수 그룹 을 사 용 했 기 때문에 좋 지 않 습 니 다. strlen (HC [I]) 으로 대체 해 야 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.