LZ77 슬라이딩 윈도 압축 계산기
문자열을 LZ77로 압축해 (거리, 길이, 다음 글자) 토큰을 하나씩 보여 주고 다시 풀어 원문이 그대로 돌아오는지 확인합니다. 창 크기를 바꿔 가며 압축률이 어떻게 달라지는지, 거리보다 긴 복사가 어떻게 동작하는지 볼 수 있습니다.
4,000자까지 다룹니다. 지금 16자, 글자 종류 2가지입니다.
얼마나 앞까지 되돌아볼지
한 번에 가리킬 최대
압축 후 크기
225.0%
16비트가 36비트가 되는 것으로 어림됩니다. 토큰 3개 가운데 1개가 앞을 가리킵니다.
토큰
| 자리 | 거리 | 길이 | 다음 | 만드는 글자 |
|---|---|---|---|---|
| 1 | — | — | a | a |
| 2 | — | — | b | b |
| 3 | 2 | 14 | (끝) | ababababababab |
파란 줄은 거리보다 길이가 긴 토큰입니다. 방금 쓴 글자를 다시 읽어 늘어나는 경우이며, 복원할 때 한 글자씩 옮겨야만 제대로 풀립니다.
복원 결과
abababababababab
원문과 글자 하나까지 같습니다.
창 크기에 따른 압축률
| 창 | 토큰 | 매치가 덮은 글자 | 압축률 |
|---|---|---|---|
| 4칸 | 3 | 14 | 168.8% |
| 8칸 | 3 | 14 | 187.5% |
| 16칸 | 3 | 14 | 206.3% |
| 32칸 | 3 | 14 | 225.0% |
| 64칸 | 3 | 14 | 243.8% |
| 256칸 | 3 | 14 | 281.3% |
| 1024칸 | 3 | 14 | 318.8% |
사용 방법
- 1압축할 글을 넣습니다. 같은 조각이 되풀이될수록 잘 줄어듭니다.
- 2창 크기와 최대 길이를 정합니다.
- 3토큰 표에서 어느 자리가 어디를 가리키는지 봅니다.
- 4복원 결과가 원문과 같은지 확인합니다.
- 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일 · 결과는 참고용 추정치입니다.