๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

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) ์ด ๋  ๊ฒƒ์ด๋‹ค.