[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ํํ๋ง ์ฝ๋(Huffman Code Problem)
Huffman Code Problem
ํํ๋ง ์ฝ๋๋ ๋ฌธ์๋ฅผ ๋ฐ์ดํฐ๋ก ํํํ ๋ ๋ ์ ์ ๋ฐ์ดํฐ์์ ์ฌ์ฉํ๋ฉด์ ๋ฌธ์๋ฅผ ํํํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ์์ถํ๋ ๋ฐฉ๋ฒ์ด๋ค.
Basic Idea
์ด ๋ฐฉ๋ฒ์ ๊ธฐ๋ณธ์ ์ธ ์์ด๋์ด๋ ๋ฌธ์์ด๋ฅผ ์ด์ง์๋ก ํํํ ๋, ํด๋น ๋ฌธ์ฅ์ด์์ ๊ฐ์ฅ ์์ฃผ ๋ฑ์ฅํ๋ ๋ฌธ์๋ฅผ ๋ค๋ฅธ ๋ฌธ์๋ณด๋ค ๋ ์งง๊ฒ ํํํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ์ด์ง ์ฝ๋์ ๊ธธ์ด๋ฅผ ๊ฐ๋ณ์ผ๋ก ๋ง๋ค๋ฉด, ์ด์ง ์ฝ๋๋ฅผ ๋ค์ ๋ฌธ์์ด๋ก ๋ณํํ ๋, ์ด๋์์ ๋์ด์ ๋ฌธ์๋ฅผ ํด๋ ํด์ผํ๋์ง ์ ์๊ฐ ์๊ฒ ๋๋ค. ์๋ฅผ ๋ค์ด A ๋ผ๋ ๋ฌธ์๊ฐ 1001 ๋ก ํํ๋์๊ณ , B ๋ผ๋ ๋ฌธ์๊ฐ 100 ์ผ๋ก ํํ๋์๋ค๋ฉด, 1001001 ์ด๋ผ๋ ์ฝ๋๊ฐ ์์ ๋, ์ฒซ ๋ฌธ์๋ฅผ B๋ก๋ ํด์ํ ์ ์๊ณ , A๋ก๋ ํด์ํ ์ ์๊ฒ๋๋ค. ์ง๊ธ์ ์ฐ๋ฆฌ์๊ฒ ์ฃผ์ด์ง ์ฝ๋์ ๊ธธ์ด๊ฐ ์งง์ ํฐ ์ํด๊ฐ ์๋ ๊ฒ ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์์ฒญ๋๊ฒ ๊ธด ๋ฌธ์์ด์ ํํํ ์ด์ง์ฝ๋๋ฅผ ํด์ํ๊ฒ ๋๋ค๋ฉด, ๊ณ์ฐ์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ด๋ง์ด๋งํ ๊ฒ์ด๋ค. ๋ฐ๋ผ์, ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Prefix Code ๋ผ๋ ๊ฐ๋ ์ ๋์ ํ๊ฒ ๋๋ค.
Prefix Free Code
Prefix Free Code ๋ ์ด๋ค ์ด์ง ์ฝ๋์ ์งํฉ์ด ์๋ก ์ ๋์ด๊ฐ ๋์ง ์์ ์ฝ๋๋ฅผ ๋งํ๋ค. ์๋ฅผ ๋ค๋ฉด ์ฐ๋ฆฌ์๊ฒ {0, 1, 01, 010} ์ด๋ผ๋ ์ด์ง์ฝ๋ ์งํฉ์ด ์์ ๋, 0์ 01๊ณผ 010์ ์ ๋์ด๊ฐ ๋ ์ ์๊ณ , 01์ 010์ ์ ๋์ด๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์, Prefix Free Code ๊ฐ ๋ ์ ์๋ค. ํ์ง๋ง ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ์ด์ง์ฝ๋ ์งํฉ์ด {00, 010, 100, 101} ์ด๋ผ๋ฉด, ๋ชจ๋ ์ฝ๋๊ฐ ์๋ก ๋ค๋ฅธ ์ฝ๋์ ๋ํด ์ ๋์ด๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ Prefix Free Code์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ค. ์ด ๊ฐ๋ ์ ์ฌ์ฉํด์ Huffman Code๋ ์์์ ์ธ๊ธํ๋ ์ค๋ณต ํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ฒ ๋์๋ค.
Huffman Code Algorithm
Algorithm Flow
ํํ๋ง ์ฝ๋๋ ์์ ์ด์งํธ๋ฆฌ์ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ์ฝ๋๋ฅผ ๋ง๋ค๊ณ ํด์ํ๋ค. ์ด๋ค ๋ฌธ์์ด์ ์ํ ๋ฌธ์์ ์ ์ฒด ๋น๋์๊ฐ 100์ด๋ผ๊ณ ํ ๋, ๊ฐ ๋ฌธ์๋ค์ด ๊ฐ์ง ๋น๋์๊ฐ ๋ค์๊ณผ ๊ฐ๋ค๊ณ ํ์.
a | b | c | d | e | f |
---|---|---|---|---|---|
45 | 13 | 12 | 16 | 9 | 5 |
๋จผ์ ์ด ํ ์ด๋ธ์ ๋น๋์๊ฐ ๋ฎ์ ์์ผ๋ก ์ ๋ ฌ์ ํด์ฃผ์ด์ผ ํ๋ค. ์ ๋ ฌ์ ์ํํ๋ฉด,
f | e | c | b | d | a |
---|---|---|---|---|---|
5 | 9 | 12 | 13 | 16 | 45 |
๋ค์๊ณผ ๊ฐ์ ํ ์ด๋ธ๋ก ์ ๋ ฌ์ด ๋๋ค. ํํ๋ง ์ฝ๋๋ ๋น๋์๊ฐ ๋ฎ์ ๋ ๊ฐ๋ฅผ ํ๋์ ์ด์งํธ๋ฆฌ๋ก ๋ง๋ค์ด ๋ฐฐ์ด์ ๋ค์ ๋ฃ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ๋น๋์๊ฐ ์ ์ผ ๋ฎ์ f ์ e ๊ฐ ํฉ์ณ์ ์๋กญ๊ฒ 14๋ก ๋ฐฐ์ด์ ๋ค์ด๊ฐ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ด์ ๋ฐฐ์ด์,
f & e | c | b | d | a |
---|---|---|---|---|
14 | 12 | 13 | 16 | 45 |
๊ฐ ๋๋ค. ๋ค์ ๋น๋์ ์์ผ๋ก ์ ๋ ฌํด๋ณด์.
c | b | f & e | d | a |
---|---|---|---|---|
12 | 13 | 14 | 16 | 45 |
์ฌ๊ธฐ์ ๋น๋์๊ฐ ๊ฐ์ฅ ๋ฎ์ ๋๊ฐ๋ฅผ ๋ฝ์์ ๋ค์ ํฉ์ณ์ค๋ค๋ฉด,
c & b | f & e | d | a |
---|---|---|---|
25 | 14 | 16 | 45 |
์ด๋ ๊ฒ ๋๊ณ , ๋ค์ ๋ฐฐ์ด์ ์ ๋ ฌํ๋ฉด,
f & e | d | c & b | a |
---|---|---|---|
14 | 16 | 25 | 45 |
์ด๋ ๊ฒ ๋๋ค. ํ ๋ฒ ๋ ํด๋ณด์
f & e & d | c & b | a |
---|---|---|
30 | 25 | 45 |
( f & e -> d ) & (c & b) | a |
---|---|
55 | 45 |
์ด๋ ๊ฒ ๋๋ค. -> ํ์๋ ์๋ก ๋ถ๋ชจ, ์์ ๋ ธ๋ ๊ด๊ณ์์ ํ๊ธฐํ๊ณ & ํ์๋ ์๋ก ํ์ ๊ด๊ณ์ ์๋ค๋ ๊ฒ์ ํ๊ธฐํ๋ค.
์ต์ข ์ ์ผ๋ก๋ ๋ฃจํธ ๋ ธ๋ ์๋์ ์ผ์ชฝ์๋ a, ์ค๋ฅธ์ชฝ์๋ ( f & e -> d ) & (c & b) ๊ฐ ๋ถ์ด์๋ ์ด์งํธ๋ฆฌ๊ฐ ์์ฑ๋๋ค.
์ ์๊ณ ๋ฆฌ์ฆ์ ์กฐ๊ธ ๋ ํธํ๊ฒ ์ํํ๋ ์๋ฃ๊ตฌ์กฐ๊ฐ ์์๊น? ๋น์ฐํ ์๋ค.. Min-Priority-Queue(์ต์์ฐ์ ์์ ํ) ๋ฅผ ์ฌ์ฉํ๋ฉด extract ํจ์๋ฅผ ํตํด ์ต์ ๊ฐ์ ๋ฐ๋ก๋ฐ๋ก ๋ฝ์๋ผ ์ ์๊ณ ์๋ก ๋ค์ด๊ฐ๋ ํฉ์ณ์ง ๋ ธ๋๋ค๋ ํ์ ๋ค์ด๊ฐ์๋ง์ ์ ๋ ฌ์ด ๋์ด ๊ด๋ฆฌํ๊ธฐ๊ฐ ์ฉ์ดํด ์ง๋ค.
Pseudo Code
๊ทธ๋ ๋ค๋ฉด, Huffman Code Algorithm์ Min-Priority-Queue๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ๋ pseudo code๋ฅผ ๋ถ์ํด๋ณด์.
Huffman-Code (c)
n = size(C)
Q = C
for i = 1 to n-1 // ์ ์ฒด ๋
ธ๋๋ค์ ๋ชจ๋ ๋ค ๋์๋ณผ ๊ฒ
do allocalte a new node z // ๋ ๊ฐ์ ์ต์๋ฑ์ฅ ํ์ ๋ฌธ์๋ฅผ ํฉ์น ๋
ธ๋๋ฅผ ์์ฑ
left[z] = Extract-Min(Q) // ์ผ์ชฝ์ ํ์ฌ ํ์์ ์ต์ ๋น๋์๋ฅผ ๋ฝ์ ๋ฃ๋๋ค
right[z] = Extract-Min(Q) // ์ค๋ฅธ์ชฝ์ ํ์ฌ ํ์์ ์ต์ ๋น๋์๋ฅผ ๋ฝ์ ๋ฃ๋๋ค
f[z] = f[left[z]] + f[right[z]] // ์๋ก ๋ง๋ ๋
ธ๋์ ๋น๋์๋ ๋ ์๋
๋
ธ๋์ ๋น๋์๋ฅผ ํฉ์น ๊ฒ
insert(Q, z) // ํ์ ์ ๋
ธ๋๋ฅผ ๋ฃ์.
return Extract-Min(Q) // ๋ง์ง๋ง์ ํ๋๋จ์ ๋
ธ๋๊ฐ ๋ฃจํธ๋
ธ๋์ผ ๊ฒ์ด๋ค.
Encoding and Decoding
- ๋ฌธ์์ huffman ์ฝ๋๋ก ๋ง๋ค ๋๋ ์ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ํธ๋ฆฌ๋ก ๋ง๋ค๊ณ , leaf ๋ ธ๋์ ๋ค๋ค๋ฅผ ๋๊น์ง ์ผ์ชฝ ์์๋ ธ๋๋ก ์ด๋ํ ๋๋ 0, ์ค๋ฅธ์ชฝ ์์๋ ธ๋๋ก ์ด๋ํ ๋๋ 1์ ์ฝ๋์ ๊ณ์ ๋ํด์ค๋ค.
- ์ฝ๋๋ฅผ ๋ฌธ์๋ก ๋ณํํ ๋๋ ๋๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก leaf ๋ ธ๋์ ๋ค๋ค๋ฅผ ๋๊น์ง ์ฝ๋๊ฐ 0์ผ ๋๋ ์ผ์ชฝ, 1์ผ ๋๋ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ณ์ ํธ๋ฆฌ๋ฅผ ๋ฐ๋ผ ์ด๋ํ๊ณ leaf์ ๋์ฐฉํ๋ฉด ๊ทธ ๋ ธ๋์ ์ ์ฅ๋์ด ์๋ ๋ฌธ์๋ฅผ ์ฝ์ด๋ค์ด๋ฉด ๋๋ค.
Alogorithm Analysis
์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์๊ฐ๋ณต์ก๋๋ O(n log n) ์ด ๋ ๊ฒ์ด๋ค.
'๐ฎ ์จ-์์ค > ๐ ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ๋๋น ์ฐ์ ํ์(BFS) (0) | 2021.07.18 |
---|---|
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ๋ฐฐ๋ญ ๋ฌธ์ (Knapsack Problem) (7) | 2021.07.17 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ(Greedy Alogorithm) (0) | 2021.07.17 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด(LCS) (0) | 2021.07.17 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ํ๋ ฌ ๊ณฑ์ ๋ฌธ์ (Matrix Chain Multiplication) (0) | 2021.07.17 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote