도구스개발

LZ77 슬라이딩 윈도 압축 계산기

문자열을 LZ77로 압축해 (거리, 길이, 다음 글자) 토큰을 하나씩 보여 주고 다시 풀어 원문이 그대로 돌아오는지 확인합니다. 창 크기를 바꿔 가며 압축률이 어떻게 달라지는지, 거리보다 긴 복사가 어떻게 동작하는지 볼 수 있습니다.

4,000자까지 다룹니다. 지금 16자, 글자 종류 2가지입니다.

얼마나 앞까지 되돌아볼지

글자

한 번에 가리킬 최대

압축 후 크기

225.0%

16비트가 36비트가 되는 것으로 어림됩니다. 토큰 3개 가운데 1개가 앞을 가리킵니다.

원문16자
토큰3개
매치를 쓴 토큰1개
매치가 덮은 글자14자 (88%)
가장 긴 매치14자
비트 어림글자 1비트 · 토큰 12비트
압축률225.0%
되풀기 검사원문과 같음

토큰

자리거리길이다음만드는 글자
1aa
2bb
3214(끝)ababababababab

파란 줄은 거리보다 길이가 긴 토큰입니다. 방금 쓴 글자를 다시 읽어 늘어나는 경우이며, 복원할 때 한 글자씩 옮겨야만 제대로 풀립니다.

복원 결과

abababababababab

원문과 글자 하나까지 같습니다.

창 크기에 따른 압축률

토큰매치가 덮은 글자압축률
4314168.8%
8314187.5%
16314206.3%
32314225.0%
64314243.8%
256314281.3%
1024314318.8%
원문 자체가 사전입니다. LZ77은 사전을 따로 만들지 않고 앞서 나온 글자열을 「몇 칸 뒤에서 몇 글자」로 가리킵니다. 그래서 사전을 주고받을 필요가 없고, 앞부분만 있으면 이어서 풀 수 있습니다. 사전을 만들어 번호로 가리키는 LZW와 갈리는 지점입니다.
거리보다 길이가 길어도 됩니다. aaaaa를 만들 때 (거리 1, 길이 4)로 적으면 푸는 쪽은 한 칸 뒤 글자를 네 번 가져오는데, 한 글자씩 옮기다 보면 방금 쓴 글자를 다시 읽어 저절로 늘어납니다. 복원에서 구간을 통째로 복사하면 여기서만 깨집니다 — 이 알고리즘을 직접 구현할 때 가장 자주 틀리는 자리입니다.
창 크기는 맞바꿈입니다. 크면 멀리 있는 반복도 잡지만 거리를 적는 데 비트가 더 듭니다. deflate는 창 32KB, 길이 258까지로 두었습니다. 위 표에서 같은 글을 창만 바꿔 압축해 보면 어느 지점부터 더 키워도 소용없는지 보입니다.
여기 나온 압축률은 gzip 결과가 아닙니다. 거리·길이·글자를 고정 폭 비트로 적었을 때의 어림이고, gzip은 그 위에 허프만 부호를 얹어 자주 나오는 값을 더 짧게 적습니다. gzip = LZ77 + 허프만이라고 보시면 됩니다.

사용 방법

  1. 1압축할 글을 넣습니다. 같은 조각이 되풀이될수록 잘 줄어듭니다.
  2. 2창 크기와 최대 길이를 정합니다.
  3. 3토큰 표에서 어느 자리가 어디를 가리키는지 봅니다.
  4. 4복원 결과가 원문과 같은지 확인합니다.
  5. 5창 크기를 바꿔 가며 압축률이 어떻게 달라지는지 견줍니다.

자주 묻는 질문

앞서 나온 글자열을 다시 적는 대신 「몇 칸 뒤에서 몇 글자」로 가리켜 줄이는 압축 방식입니다. 1977년 렘펠과 지브가 발표했으며, gzip·zip·PNG가 모두 이 방식에 허프만 부호를 얹은 구조(deflate)입니다.

됩니다. 그리고 그것이 이 알고리즘의 묘미입니다. aaaaa를 만들 때 (거리 1, 길이 4)로 적으면 푸는 쪽은 한 칸 뒤 글자를 네 번 가져오는데, 한 글자씩 옮기다 보면 방금 쓴 글자를 다시 읽어 저절로 늘어납니다. 다만 복원할 때 구간을 통째로 복사하면 이 경우에 결과가 깨지므로 반드시 한 글자씩 옮겨야 합니다.

크면 멀리 있는 반복도 잡지만 거리를 적는 데 비트가 더 듭니다. deflate는 창을 32KB, 길이를 258까지로 두고 있습니다. 이 도구에서 창 크기를 바꿔 보면 같은 글이라도 잡히는 반복의 개수와 압축률이 달라지는 것이 보입니다.

LZW는 사전을 따로 만들어 번호로 가리키고, LZ77은 사전 없이 원문 자체를 사전처럼 씁니다. 그래서 LZ77은 사전을 주고받을 필요가 없고 앞부분만 있으면 이어서 풀 수 있습니다. GIF가 LZW, gzip이 LZ77 계열입니다.

되풀이가 없으면 토큰이 글자보다 비싸기 때문입니다. 매치가 없는 자리도 (0, 0, 글자) 토큰으로 적어야 하는데 거리와 길이 자리가 그대로 낭비됩니다. 실제 gzip은 리터럴과 매치를 구분해 적고(LZSS) 허프만으로 다시 줄이므로 이만큼 나빠지지는 않습니다.

다릅니다. 이 도구는 거리·길이·글자를 고정 폭 비트로 적었을 때를 어림한 값입니다. gzip은 그 위에 허프만 부호를 얹어 자주 나오는 값을 더 짧게 적으므로 실제로는 더 줄어듭니다. 원리를 보이기 위한 값으로 보시는 것이 맞습니다.

전송되지 않습니다. 압축과 복원은 모두 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 정답지는 되풀기입니다. 압축한 토큰을 다시 풀어 원문과 글자 하나까지 같은지 확인하며, 반복이 심한 글·무작위 글 200개·한글·이모지·창 크기 여섯 가지에서 모두 왕복하는 것을 테스트로 고정했습니다.
  • 거리보다 길이가 긴 겹치는 복사를 따로 겨냥한 검사를 넣었습니다. 복원에서 구간을 통째로 옮기면 이 경우에만 깨지기 때문입니다.
  • 토큰은 고전적인 세 쌍(거리, 길이, 다음 글자)입니다. gzip이 쓰는 LZSS는 리터럴과 매치를 구분해 적어 조금 다르지만, 원리를 보이는 데는 세 쌍이 낫습니다.
  • 크기 어림에서 글자 하나의 비트는 서로 다른 글자 수로 잡습니다. 한글 텍스트를 8비트로 셈하면 맞지 않기 때문입니다. 허프만을 얹지 않은 값이라 실제 gzip보다 나쁘게 나옵니다.
  • 글은 4000자까지, 창은 4096칸까지 다룹니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.