> lz77 | sliding | window <
// LZ77 – 슬라이딩 윈도우와 사전 참조를 사용하는 압축 알고리즘
>> 기능
사전 코딩
오프셋과 길이 참조를 사용해 반복되는 패턴을 재사용합니다.
슬라이딩 윈도우
최장 일치를 찾기 위해 이동하는 윈도우를 유지합니다.
기반 알고리즘
ZIP, GZIP, DEFLATE, PNG 등 현대 압축 포맷의 기반입니다.
>> 기술 정보
LZ77 동작 방식
LZ77은 최근에 본 데이터로 구성된 슬라이딩 윈도우를 유지합니다. 각 위치에서 윈도우 안에서 가장 긴 일치 문자열을 찾습니다. 일치가 있으면 (오프셋, 길이, 다음 문자) 참조를 출력하고, 없으면 (0,0,문자)와 같은 리터럴을 출력합니다. 이렇게 반복되는 패턴을 짧은 참조로 대체하여 무손실 압축을 제공합니다.
LZ77 예제
Text: "ABCABCABC" Window=4, Lookahead=4 Position 0: 'A' - no match → (0,0,A) Position 1: 'B' - no match → (0,0,B) Position 2: 'C' - no match → (0,0,C) Position 3: 'ABC' - matches at offset 3 → (3,3,A) Position 7: 'BC' - matches at offset 3 → (3,2,) Output: (0,0,A)(0,0,B)(0,0,C)(3,3,A)(3,2,)
왜 LZ77을 사용하나요?
- 무손실 데이터 압축
- 데이터 형식을 미리 알 필요 없음
- 데이터 패턴에 자동으로 적응
- 구현이 비교적 단순함
- 현대 압축 알고리즘의 핵심 기반
>> 자주 묻는 질문
LZ77이란 무엇인가요?
LZ77은 Abraham Lempel과 Jacob Ziv가 1977년에 발표한 범용 무손실 데이터 압축 알고리즘입니다. 비압축 데이터 스트림에서 이전에 나타난 부분에 대한 참조로 반복되는 데이터를 대체하여 압축을 수행합니다.
슬라이딩 윈도우는 어떻게 동작하나요?
슬라이딩 윈도우는 이미 처리한 데이터를 담는 검색 버퍼와 앞으로 압축할 데이터를 담는 룩어헤드 버퍼로 구성됩니다. 알고리즘은 검색 버퍼에서 룩어헤드 버퍼 시작과 가장 길게 일치하는 부분을 찾고, 그에 따라 참조 또는 리터럴을 출력합니다.
LZ77과 현대 압축 기법의 차이점은?
LZ77은 많은 현대 압축 알고리즘의 기반입니다. ZIP과 GZIP에서 사용하는 DEFLATE는 LZ77과 허프만 코딩을 결합합니다. LZSS는 LZ77의 중복을 줄이고, LZ78과 LZW는 다른 방식으로 사전을 구축하지만 기본 원리는 유사합니다.
적절한 윈도우 크기는 얼마인가요?
일반적인 데이터의 경우 32KB~64KB 윈도우가 자주 사용됩니다. 더 큰 윈도우는 더 많은 일치를 찾지만 메모리와 시간이 더 많이 필요합니다. DEFLATE는 32KB를 사용하며, 룩어헤드 버퍼는 보통 256~512바이트입니다. 최적의 크기는 데이터의 반복 패턴에 따라 달라집니다.