2014-10-22 5 views
1

난 그냥 허프만의 데이터 압축 알고리즘에 대한 학습 시작 전 별도의 코드 테이블 배열이 왜 이해가 안 다음 함수> filltable()와 invertcode()허프만의 데이터 압축 filltable와 반전 코드 문제

에 도움이 필요 필요합니다.

while (n>0){ 
    copy = copy * 10 + n %10; 
    n /= 10; 
} 

날 n은 항상 곁에 상관없이 0보다 큰 없을 것입니다 때문에이 열로 나눈 0보다 큰 경우 함수의이 부분에가는 이유가 무엇인지 이해하는 데 도움이됩니다 몇 번을 그것을 나눴다. 코드

링크 : http://www.programminglogic.com/implementing-huffman-coding-in-c/

void fillTable(int codeTable[], Node *tree, int Code){ 

    if (tree->letter<27) 
     codeTable[(int)tree->letter] = Code; 
    else{ 
     fillTable(codeTable, tree->left, Code*10+1); 
     fillTable(codeTable, tree->right, Code*10+2); 
    } 

    return; 
} 
void invertCodes(int codeTable[],int codeTable2[]){ 
    int i, n, copy; 

    for (i=0;i<27;i++){ 
     n = codeTable[i]; 
     copy = 0; 
     while (n>0){ 
      copy = copy * 10 + n %10; 
      n /= 10; 
     } 
     codeTable2[i]=copy; 
} 

** 편집 **

이 질문에 더 명확 내가 허프만 인코딩 및 디코딩에 대한 설명이 필요하지 않습니다 만들려면하지만 방법에 대한 설명이 필요 이 두 가지 기능이 작동하며 왜 코드 테이블이 필요한가?

답변

1

n은 int입니다. 따라서 시간이 지남에 따라 0으로 줄어 듭니다. n이 첫 번째 반복에서 302에서 시작하면 첫 번째 n /= 10; 다음에 30으로 줄어 듭니다. while 루프의 두 번째 반복 끝에 4 번째 반복 끝에 3으로 감소합니다. 0 (int 4/int 10 = int 0)과 같습니다.

정수 계산입니다. 무한대까지 확장 할 십진수 비트가 없습니다.

+0

감사합니다. 덕분에이 기능을 조금 더 설명 할 수있었습니다. –

1

데이터 코드의 끝을 포함하도록 예제 프로그램을 약간 업데이트했습니다. 원본 예제 코드는 압축을 풀 때 원본 데이터 끝에 추가 문자를 추가 할 수 있습니다. 또한이 코드에는 코드 수가 27 개 였고 추가 한 데이터 코드의 끝을 포함하도록 28 개로 변경 한 항목과 출력 파일 이름이 포함 된 많은 내용이 있습니다. "compress.bin"(압축하는 경우) 또는 "output.txt"(압축을 해제하는 경우)로 변경되었습니다. 최적의 구현은 아니지만 학습 예제로 사용해도 좋습니다. 코드를 소스 레벨 디버거로 따라 가면 도움이됩니다.

http://rcgldr.net/misc/huffmanx.zip

더 현실적인 허프만 프로그램은 인코딩 및 디코딩을 수행하는 테이블을 사용합니다. 인 코드 테이블은 입력 코드로 인덱싱되며 각 테이블 항목에는 두 값, 코드의 비트 수 및 코드 자체가 포함됩니다. 디코드 테이블은 코드를 결정하는 데 필요한 입력 스트림의 최소 비트 수 (최소 9 비트이지만 10 비트 일 필요가 있음)로 구성된 코드로 인덱싱되며 해당 테이블의 각 항목에는 두 개의 값, 실제 비트 수 및 해당 코드가 나타내는 문자 (또는 데이터 끝)가 포함됩니다. 실제 비트 수는 코드를 결정하는 데 사용 된 숫자 비트보다 작을 수 있으므로 압축 파일에서 데이터를 읽기 전에 왼쪽 비트를 버퍼링하여 사용해야합니다.

허프만과 유사한 프로세스의 변형은 디코드 테이블의 크기를 줄이기 위해 각 코드의 선행 비트로 결정되는 코드 길이를 갖는 것입니다.