더북(TheBook)

3.4 LZW 압축

 

 

허프만 코드 이면에 있는 생각은 일반적인 아이템에는 더 짧은 인코딩을, 빈도가 낮게 출현하는 아이템에는 더 긴 인코딩을 사용하는 것이다. 아이템의 인코딩 길이에 변화를 주는 대신에 인코딩하고자 하는 아이템의 길이를 변경한다면 어떻게 될까? 이러한 의문은 아브라함 렘펠(Abraham Lempel), 야콥 지브(Jacob Ziv), 테리 웰치(Terry Welch)가 고안한 효율적이면서도 간단한 압축 알고리즘인 LZW(Lempel-Ziv-Welch) 압축의 배경이 되었다.

아스키로 인코딩된 텍스트가 있다고 해 보자. 앞에서 살펴보았듯이 이것은 문자당 7비트가 필요하다. 이제 기존 방식에서 약간 나아가서 인코딩하는 데 더 많은 비트를 사용하기로 한다. 즉, 최소 7비트가 아닌 8비트로 아이템을 인코딩한다. 이것은 좀 이상해 보일 수도 있지만, 그 안에 방법이 있다. 8비트로는 28 = 256가지 아이템을 표현할 수 있다. 0x00(0)부터 0x7F(127)까지의 숫자는 아스키 문자를 표현하는 데 사용한다(표 3-1 참조). 그리고 0x80(128)부터 0xFF(255)까지의 숫자는 원하는 것을 표현하는 데 사용할 수 있다. 우리는 이러한 128개 숫자를 한 개 문자 대신에 둘, 셋 또는 그 이상의 문자열을 표현하는 데 사용할 것이다. 두 개 문자로 구성된 문자열을 바이그램(bigram)이라 하고, 세 개 문자로 구성된 문자열을 트라이그램(trigram)이라 한다. 이보다 더 긴 문자열은 구성하는 문자의 수에 그램(gram)이란 접미사를 붙여 부르는데, 일반적으로 n-gram이라고 한다. 또한, 단일 아이템을 갖는 n-gram은 유니그램(unigram)이라고 한다. 그래서 0부터 127까지는 유니그램을 표현하는 데 사용하고, 128부터 255까지는 유니그램이 아닌 1보다 큰 n-gram을 나타내는 데 사용한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.