CS/알고리즘 분석

[알고리즘분석] 3. 탐욕법 (Greedy)

2024. 4. 23. 17:57
목차
  1. 허프만 코드와 데이터 압축
  2. Prefix-Free code
  3. Huffman Code
  4. 허프만 코드의 구현 방법과 시간 복잡도
반응형

허프만 코드와 데이터 압축

컴퓨터는 문자를 그대로 이해하지 못한다.

따라서 문자를 컴퓨터가 이해할 수 있도록 숫자로 바꾸어주어야 한다.

 

문자를 숫자로 변환하는 것을 '인코딩'

숫자에서 다시 문자로 변환하는 것을 '디코딩' 이라고 한다.

 

예를 들어 아래와 같은 규칙의 코드 표가 있다면

 

a,b,c,d 4개 문자로 구성된 아래 문자열을 그 아래처럼 인코딩할 수 있다.

 

13자리 문자열이 26자리 bit 리스트로 인코딩되었다.

 

Prefix-Free code

문자열을 인코딩할 때 사용하는 코드 표는 다른 규칙의 코드표를 사용해도 된다.

 

이런 코드 표를 사용하더라도 문제없이 인코딩과 디코딩이 가능하다.

이때, 각각의 bit 가 선택됨에 따라 어떤 문자를 가리키게 되는지를 이진트리로 나타낼 수 있는데

 

위와 같이 나타난다.

이 코드표를 사용하여 위에서 언급한 abcd로 구성된 문자열을 인코딩하면

 

이렇게 인코딩되며, 그 길이는 25 로 전보다 1이 줄어들었음을 알 수 있다.

 

인코딩된 코드로부터, 다시 문자열로 디코딩하기 위해서는 한가지 규칙이 규칙이 필요하다.

바로 코드 표의 규칙상 어떤 코드도 다른 코드의 prefix가 될 수 없다는 규칙이다.

이 규칙이 깨지면 디코딩을 할 때 서로 다른 2가지 방법의 디코딩 방법이 생길 수 있다.

 

Huffman Code

허프만 코드는 임의 문자열을 인코딩한 결과가 제일 짧게 나오도록 하는 인코딩 방식을 의미한다.

우선 일반적으로 제일 짧게 인코딩하려면 인코딩하려는 각 문자를 leaf로 하는 extended binary search tree 를 그리면 된다.

 

그리고 왼쪽을 0, 오른쪽을 1 이라고 정의하면 (정의하기 나름이다.)

 

이런 코드가 나온다.

 

그리고 처음에 본 그 abcd 문자열의 인코딩 결과가 24비트로 더 줄어들었다.

 

어떤 문자가 주어질지 모르는 상황에서는 위 방식처럼 etended binary search tree 를 그리는 것이 적합하다.

하지만 어떤 문자의 빈도수를 추가로 알고 있다면, 평균적으로 자주 나오는 문자를 더 짧게 인코딩하고, 자주 나오지 않는 문자를 길게 인코딩하여 최적화를 할 수 있을 것이다.

허프만 코드가 이 아이디어를 사용한다.

 

그 구체적인 아이디어는 다음과 같다.

 

1. 제일 빈도수가 낮은 코드 2개를 합하여 sibling leaf node 로 둔다. 그리고 그 부모 노드는 그 둘의 빈도수 합이다.

2. 1에서 구한 빈도수 합을 포함한 전체 빈도수 리스트에서 빈도수가 제일 낮은 2개를 골라 묶는다.

역시 그 부모는 빈도수의 합이다.

3. 1, 2 과정을 반복하여 하나의 트리를 만든다. 이 트리를 코드로 나타내면 가장 최적의 인코딩 길이를 갖는 코드가 되며, 이 코드를 허프만 코드라고 부른다.

 

그 증명은 생략한다.

 

허프만 코드의 구현 방법과 시간 복잡도

1. 빈도수 순으로 정렬하고, 제일 작은 2개를 합한다. 다시 정렬하고, 제일 작은 2개를 합한다. 최악의 경우 n번의 정렬을 수행하므로 O(n²logn) 시간복잡도를 갖는다.

 

2. 굳이 정렬할 필요없이 전체 순회를 하면서 제일 작은 2개를 찾는다. 한번 2개를 찾는데 O(n) 시간이 걸리므로 전체 시간복잡도는 O(n²) 이다.

 

3. 우선순위 큐를 활용하여 전체 데이터를 다 넣은 뒤 (또는 O(n) 시간으로 힙으로 만든 뒤) 2번 pop 하고 한번 push 하는 과정을 n번 반복한다. pop, push 에 O(log n) 이 소모되므로, 전체 시간복잡도는 O(n log n) 이다.

 

만약 이미 정렬되어있는 경우, 2개의 큐를 사용하여 O(n) 시간에 구할수도 있다.

첫번째 큐에는 빈도수 순으로 정렬된 데이터를 넣고, 두번째 큐는 비워둔다.

1. 첫번째 큐에서 제일 작은 2개 데이터를 뺀다. (즉 pop 2번)

2. 이를 더해서 두번째 큐에 넣는다.

3. 첫번째 큐에서 값을 하나 뺀다. 두번째 값을 빼기 전 두번째 큐의 front 에 있는 값과 비교하여 더 작은 값을 취해 더한 뒤 두번째 큐에 넣는다.

4. 이 과정을 반복한다.

 

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'CS > 알고리즘 분석' 카테고리의 다른 글

[알고리즘분석] 2. 동적 계획법 (Dynamic Programming)  (0) 2024.04.23
[알고리즘분석] 1. 분할 정복 (Divide and Conquer)  (1) 2024.04.23
[알고리즘분석] 0. Preliminaries : 덧셈/곱셈 & 피보나치 수열의 시간복잡도  (0) 2024.04.22
  1. 허프만 코드와 데이터 압축
  2. Prefix-Free code
  3. Huffman Code
  4. 허프만 코드의 구현 방법과 시간 복잡도
'CS/알고리즘 분석' 카테고리의 다른 글
  • [알고리즘분석] 2. 동적 계획법 (Dynamic Programming)
  • [알고리즘분석] 1. 분할 정복 (Divide and Conquer)
  • [알고리즘분석] 0. Preliminaries : 덧셈/곱셈 & 피보나치 수열의 시간복잡도
에버듀
에버듀
개발은 좋은데 뭘로 개발할까
에버듀
Blog. 에버듀
에버듀
전체
오늘
어제
  • 분류 전체보기 (587)
    • 개인 프로젝트 (43)
      • [2020] 카카오톡 봇 (9)
      • [2021] 코드악보 공유APP (22)
      • [2022] 유튜브 뮤직 클론코딩 (9)
      • 간단한 프로젝트 (3)
    • 팀 프로젝트 (22)
      • [2020] 인공지능 숫자야구 (4)
      • [2022] OSAM 온라인 해커톤 (10)
      • [2024] GDSC 프로젝트 트랙 (6)
      • [2025] 큰소리 웹 페이지 (2)
    • 알고리즘 (PS) (107)
      • BOJ (101)
      • Programmers (5)
      • 알고리즘 이모저모 (1)
    • CS (312)
      • 자료구조 (19)
      • 어셈블리 (41)
      • 멀티미디어응용수학 (7)
      • 컴퓨터 구조 (29)
      • 알고리즘 분석 (4)
      • 컴퓨터 네트워크 (38)
      • 프로그래밍언어론 (15)
      • HCI 윈도우즈프로그래밍 (26)
      • 기초데이터베이스 (29)
      • 운영체제 (23)
      • 오토마타 (24)
      • 문제해결기법 (11)
      • 블록체인 (22)
      • 소프트웨어공학 (12)
      • 기계학습심화 (12)
    • 자기계발 (35)
      • 동아리 (7)
      • 자격증 (2)
      • 코딩테스트, 대회 (8)
      • 생각 정리 (17)
      • 머니 스터디 (1)
    • WEB(BE) (5)
      • express.js (1)
      • flask (0)
      • Spring & Spring Boot (4)
    • WEB(FE) (2)
      • html, css, js (1)
      • React.js (1)
    • Tool & Language (6)
      • Edit Plus (1)
      • Git (1)
      • Python3 (2)
      • Java (2)
    • Infra (12)
      • AWS (1)
      • Oracle Cloud (8)
      • Firebase (2)
      • Network (1)
    • Android (18)
      • Java (6)
      • Flutter (12)
    • Window (2)
      • Visual Studio 없이 WPF (1)
      • MFC (1)
    • 독서 (14)
      • Inside Javascript (7)
      • Database Internals (6)
      • 한 글 후기 (1)
    • 인턴 (8)
      • 델파이 (7)
      • Oracle (1)

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.1.4
에버듀
[알고리즘분석] 3. 탐욕법 (Greedy)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.