2010-08-18 3 views
1

임의의 바이너리 파일을 처리해야하는 huffman 압축기와 압축 해제 프로그램 (C++)을 작성하고 있습니다. 약간의 데이터 구조 조언이 필요합니다.허프만 코딩의 바이트 주파수 테이블

  • 이 파일의 각 바이트 패턴의 주파수를 계산하기 위해 문자 * 버퍼
  • 사용 성병 : :지도에 바이너리 형식으로 파일의 바이트를 읽어 다음과 같이 바로 지금, 내 압축 과정은 . (여기서 내가 문제를 묻고 있다고 생각합니다.)
  • 빈도 막대 그래프를 기반으로 이진 트리를 작성하십시오. 각 내부 노드는 자식 노드의 빈도의 합계를 가지며 각 리프 노드는 실제 바이트를 나타내는 char *를가집니다.

여기가 지금까지 있습니다.

내 질문은 그냥 char *에서 int로 맵을 사용하면 정확히 측정 할 수 있습니다. 내가 옳다면 실제로 필요한 것이 아닙니다. 내가 실제로하고있는 생각은 char *를 사용하여 실제 4 바이트 포인터 값을 추적하는 것입니다.

그래서 내가 할 계획은 히스토그램에 맵을 사용하고 리프 노드에 저장된 데이터에 char을 사용하는 것입니다. 내 논리가 여기 소리가 나는거야? 제 추론에 따르면 그렇습니다.하지만 바이너리 데이터를 처음 다루는 이래로 이상한 방법으로 만 나타날 수있는 함정에주의하고 싶습니다.

감사합니다.

답변

3

지도가 필요하지 않습니다. 가능한 값은 256 개뿐입니다. int freq[256] = {0}을 입력하고 입력의 각 바이트에 대해 freq[data[idx]]++을 추가하십시오.

지도가 실제로 필요한 경우 map<unsigned char, int>; char*에서지도 사용에 대한 의문이 발생했습니다.

+0

실제로 많은 의미가 있습니다. 나는 STL 컨테이너 오류를 디버깅하는 것을 피하기위한 것이다. – RyanG

+0

그 외에도 맵에는 실제로 상당한 오버 헤드가 있습니다. 모든 항목은 별도의 힙 할당이며 모든 조회에는 lg (N) 개의 포인터 역 참조가 포함됩니다. 키가 넓거나 복잡한 항목을 많이 저장하는 경우 좋고 좋지만 배열을 사용하지 않을 때는 배열을 사용하는 것이 좋습니다. –