An open API service indexing awesome lists of open source software.

https://github.com/jeiel85/minimal-zip-concept

Minimal Zip Concept (MZC) - Learning-oriented lossless compression engine in Rust featuring RLE, Dictionary, LZ77, BCJ, Delta, and Dynamic Huffman Coding with a real-time GUI plot dashboard.
https://github.com/jeiel85/minimal-zip-concept

ans compression context-mixing egui gui huffman-coding learning-by-doing lossless-compression lz77 plots-dashboard preprocessors rust simd visualizer wasm

Last synced: about 15 hours ago
JSON representation

Minimal Zip Concept (MZC) - Learning-oriented lossless compression engine in Rust featuring RLE, Dictionary, LZ77, BCJ, Delta, and Dynamic Huffman Coding with a real-time GUI plot dashboard.

Awesome Lists containing this project

README

          

# MZC (Minimal Zip Concept)



๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด | ๐ŸŒ English


MZC๋Š” Rust ํ•™์Šต๊ณผ ์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž‘๋™ ์›๋ฆฌ์˜ ์ดํ•ด๋ฅผ ๋ณ‘ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ง์ ‘ ์„ค๊ณ„ํ•œ ๋ฌด์†์‹ค ์••์ถ• ํฌ๋งท ๋ฐ CLI/GUI ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
์ƒ์šฉ ์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜(ZIP, Zstandard, Brotli ๋“ฑ)์„ ๋Šฅ๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ๊ฐ€ ์•„๋‹ˆ๋ผ, ๋ฐ”์ดํŠธ ์ •ํ•ฉ์„ฑ๊ณผ ๋ฌด์†์‹ค ๋ณต์›์˜ ์›๋ฆฌ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ  ์ ์ง„์ ์ธ ํฌ๋งท ๊ณ ๋„ํ™” ๋‹จ๊ณ„๋ฅผ ์‹ค์Šตํ•˜๋Š” ๋ฐ ์ดˆ์ ์„ ๋งž์ถ”์—ˆ์Šต๋‹ˆ๋‹ค.

[![Try it in your browser](https://img.shields.io/badge/Try%20it%20in%20your%20browser-WASM%20Demo-brightgreen?style=for-the-badge&logo=webassembly&logoColor=white)](https://jeiel85.github.io/minimal-zip-concept/)
[![Crates.io](https://img.shields.io/crates/v/mzc.svg?style=for-the-badge&color=orange)](https://crates.io/crates/mzc)
[![License](https://img.shields.io/badge/license-MIT-blue.svg?style=for-the-badge)](https://github.com/jeiel85/minimal-zip-concept)
[![Codecov](https://img.shields.io/codecov/c/github/jeiel85/minimal-zip-concept?style=for-the-badge&logo=codecov)](https://codecov.io/gh/jeiel85/minimal-zip-concept)


### ๐Ÿš€ **[Try MZC Interactive LZ77 Visualizer & WASM Demo! (์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐ”๋กœ ํ•ด๋ณด๊ธฐ)](https://jeiel85.github.io/minimal-zip-concept/)**

![MZC Interactive LZ77 sliding window visualizer](assets/mzc_lz77_visualizer.png)

*MZC Web Demo - Interactive LZ77 Sliding Window Visualizer*

---

## 1. MZC ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๋งˆ์ผ์Šคํ†ค ๋ณ€์ฒœ์‚ฌ (MZC1 ~ MZC7)

MZC๋Š” ๋‹จ์ˆœํ•œ RLE ์••์ถ•๊ธฐ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ์ตœ์ƒ์œ„ ๋น„ํŠธ ๋ ˆ๋ฒจ ํŒจํ‚น ๋ฐ ์ปจํ…์ŠคํŠธ ๋ฏน์‹ฑ ์‚ฌ์–‘๊นŒ์ง€ ์ ์ง„์ ์œผ๋กœ ์ง„ํ™”ํ•ด ์™”์Šต๋‹ˆ๋‹ค.

### 1.1 MZC1 (Retro RLE Spec)
- **์•Œ๊ณ ๋ฆฌ์ฆ˜**: ๋‹จ์ˆœ Run-Length Encoding
- **ํ—ค๋” ๊ทœ๊ฒฉ**: 54๋ฐ”์ดํŠธ ๊ณ ์ • ํ—ค๋”
- **๋™์ž‘**: ์—ฐ์†์ ์œผ๋กœ 4๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋˜๋Š” ๋ฐ”์ดํŠธ ํ๋ฆ„์„ `Value`์™€ `Count` ์กฐํ•ฉ์œผ๋กœ ๋‹จ์ˆœ ๊ธฐ๋ก. ๋ฐ์ดํ„ฐ์˜ ๋น„์••์ถ• ๋ถˆ๊ทœ์น™ ํ๋ฆ„์€ `Literal Block`์œผ๋กœ ์ฒ˜๋ฆฌ.

### 1.2 MZC2 (Parallel Dictionary Spec)
- **์•Œ๊ณ ๋ฆฌ์ฆ˜**: Dictionary Hybrid + Rayon ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๋ณ‘๋ ฌํ™”
- **ํ—ค๋” ๊ทœ๊ฒฉ**: 56๋ฐ”์ดํŠธ ๊ณ ์ • ํ—ค๋” (์‚ฌ์ „ ํ…Œ์ด๋ธ” ํฌ๊ธฐ ์ •๋ณด 2๋ฐ”์ดํŠธ ์ถ”๊ฐ€)
- **๋™์ž‘**: ํŒŒ์ผ์„ 1MB ์ฒญํฌ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋กœ ๊ฐ ์Šค๋ ˆ๋“œ์—์„œ ๋ณ‘๋ ฌ ์••์ถ•. ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋ฅผ ์‚ฌ์ „์— ์ˆ˜์ง‘ํ•˜์—ฌ ํ† ํฐ ์ธ๋ฑ์Šค๋กœ ๋Œ€์น˜ ์••์ถ•.

### 1.3 MZC3 (Sliding Window Chunk Spec)
- **์•Œ๊ณ ๋ฆฌ์ฆ˜**: LZ77 + Huffman (์ •์  ํ—ˆํ”„๋งŒ ์ฝ”๋”ฉ)
- **๋™์ž‘**: 32KB ํฌ๊ธฐ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๋ฃฉ์–ดํ—ค๋“œ ๋‚ด์—์„œ ์ด์ „ ๋ฐ์ดํ„ฐ์™€์˜ ์ค‘๋ณต ์˜์—ญ์„ ๊ฐ์ง€ํ•˜์—ฌ ๊ฑฐ๋ฆฌ(Distance)์™€ ๊ธธ์ด(Length) ์ •๋ณด์˜ ๋ฐฑ๋ ˆํผ๋Ÿฐ์Šค๋กœ ์ฝ”๋”ฉ. ์••์ถ• ํšจ์œจ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์ •์  ํ—ˆํ”„๋งŒ ๋ถ€ํ˜ธํ™”๋ฅผ 2์ฐจ ๊ฒฐํ•ฉ.

### 1.4 MZC4 (Dynamic Huffman Spec)
- **์•Œ๊ณ ๋ฆฌ์ฆ˜**: Canonical Dynamic Huffman Tree
- **๋™์ž‘**: 1KB ํฌ๊ธฐ ์ด์ƒ์˜ ์ •์  ํŠธ๋ฆฌ ํ—ค๋” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ํƒ€ํŒŒํ•˜๊ธฐ ์œ„ํ•ด, ์‹ค์ œ ์ฒญํฌ ํŒŒ์ผ์—์„œ ์ถœํ˜„ํ•œ ๊ธฐํ˜ธ ๋นˆ๋„๋ฅผ ๊ธฐ์ค€ํ•˜์—ฌ Canonical Tree๋ฅผ ๋™์  ์ƒ์„ฑ. ํŠธ๋ฆฌ์˜ ์ฝ”๋“œ๊ธธ์ด ์ •๋ณด ์ž์ฒด๋ฅผ Tree RLE ์••์ถ•์œผ๋กœ ๋ฌถ์–ด ๋‹จ 20~40๋ฐ”์ดํŠธ์˜ ์ดˆ์Šฌ๋ฆผ ํ—ค๋”๋ฅผ ์‹คํ˜„.

### 1.5 MZC5 (Bit-Packed Spec & Preprocessors)
- **์•Œ๊ณ ๋ฆฌ์ฆ˜**: ๐Ÿช™ ๋น„ํŠธ ๋ ˆ๋ฒจ ํ”Œ๋ž˜๊ทธ ํŒจํ‚น + โšก ์ง€์—ฐ ๋งค์นญ + ๐ŸŽน BCJ / Delta ์ „์ฒ˜๋ฆฌ ํ•„ํ„ฐ
- **๋™์ž‘**:
- **Bit-level Stream Packing**: ๋ธ”๋ก๋งˆ๋‹ค ๋ถ™๋˜ 1๋ฐ”์ดํŠธ ์ ‘๋‘์‚ฌ ํƒ€์ž… ๋ฐ”์ดํŠธ๋ฅผ ์ „๋ฉด ํ๊ธฐํ•˜๊ณ , ์••์ถ• ์š”์†Œ 8๊ฐœ์”ฉ ๋ฌถ์–ด 2๋ฐ”์ดํŠธ(16๋น„ํŠธ, 2๋น„ํŠธ x 8) ํ”Œ๋ž˜๊ทธ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ง๋ ฌํ™”ํ•˜์—ฌ ์˜ค๋ฒ„ํ—ค๋“œ 15~25% ๊ฐ์†Œ.
- **Lazy Matching**: ๊ทธ๋ฆฌ๋””(Greedy) ๋ฐฉ์‹ LZ77 ํƒ์ƒ‰์„ ์šฐํšŒํ•˜์—ฌ, ํ•œ ๋ฐ”์ดํŠธ ์ง„ํ–‰ํ•œ ์˜คํ”„์…‹์—์„œ ๋” ๊ธด ์ผ์น˜ ํ•ญ๋ชฉ์ด ์ถœํ˜„ํ•  ์‹œ ํ˜„์žฌ ๋ฐ”์ดํŠธ๋Š” ๋ฆฌํ„ฐ๋Ÿด๋กœ ๋ณด๋‚ด๊ณ  ๋” ๊ธด ์ผ์น˜ ์ •๋ณด๋ฅผ ์ธ์ฝ”๋”ฉ.
- **Delta Preprocessor**: Wav, Bmp ๋“ฑ ์ธ์ ‘ ํŒŒํ˜•/๋ฐ”์ดํŠธ ๊ฐ„ ์ฐจ๋ถ„๊ฐ’ ๊ณ„์‚ฐ์œผ๋กœ ์ •๋ณด ์—”ํŠธ๋กœํ”ผ๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ถ•์†Œ.
- **BCJ Preprocessor**: x86 ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ Jump/Call ๋ช…๋ น ์ƒ๋Œ€ ์ฃผ์†Œ๋ฅผ ์ ˆ๋Œ€ ์ฃผ์†Œ๋กœ ๋Œ€์น˜ ๋Œ€์นญ์‹œ์ผœ ๋ฐ์ดํ„ฐ ๋ฐ˜๋ณต๋ฅ  ์œ ๋„.
- **Decompression Safety Verification**: ๋ฐ์ดํ„ฐ ๋ณต์› ์‹œ ์œ ํ•ดํ•œ ๊นจ์ง„ ๋ฐ์ดํ„ฐ ์˜ค์—ผ์ด ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋””์ฝ”๋”์—์„œ ์ž„์˜ ํฌ๊ธฐ ๋ฒกํ„ฐ ํ• ๋‹น ๋ฐ ์ธ๋ฑ์Šค ์›”๊ฒฝ์„ ์ฆ‰์‹œ ๊ฐ์ง€ํ•˜์—ฌ ์ฐจ๋‹จํ•˜๋Š” ์•ˆ์ „๋ง ๋‚ด์žฅ.

### 1.6 MZC6 (Asymmetric Numeral Systems & Shared Dictionaries Spec)
- **์•Œ๊ณ ๋ฆฌ์ฆ˜**: Asymmetric Numeral Systems (tANS) + LZ77 Hash Chains + Global Shared Dictionary
- **ํ—ค๋” ๊ทœ๊ฒฉ**: 56๋ฐ”์ดํŠธ ๊ณ ์ • ํ—ค๋” (์‚ฌ์ „ ํฌ๊ธฐ ํ•„๋“œ ์žฌํ™œ์šฉ)
- **๋™์ž‘**:
- **LZ77 Hash Chains**: ์„ ํ˜• ํƒ์ƒ‰ ๋Œ€์‹  65,536๊ฐœ ํฌ๊ธฐ์˜ ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ๋„์ž…ํ•˜์—ฌ 3๋ฐ”์ดํŠธ ์ ‘๋‘์‚ฌ์˜ ๋งค์นญ ์ฒด์ธ์„ ๋’ค์ซ“๋Š” ๋ฐฉ์‹์œผ๋กœ $O(limit)$ ๋งค์นญ ์Šค์บ” ๋‹ฌ์„ฑ.
- **tANS (Table-based Asymmetric Numeral Systems)**: Huffman ์ฝ”๋”ฉ์˜ 1๋น„ํŠธ ํ•œ๊ณ„๋ฅผ ๋ŒํŒŒํ•˜์—ฌ ๋ถ„์ˆ˜ ๋น„ํŠธ ๋‹จ์œ„์˜ ์—”ํŠธ๋กœํ”ผ ์••์ถ•์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ตœ์ฒจ๋‹จ ANS ์••์ถ• ์—”์ง„ ๋‚ด์žฅ (`src/ans.rs`).
- **Global Shared Dictionary**: ๊ฐœ๋ณ„ ์ฒญํฌ ๋‚ด ์‚ฌ์ „์„ ์ค‘๋ณต ์ง๋ ฌํ™”ํ•˜์ง€ ์•Š๊ณ , ํŒŒ์ผ ํ—ค๋” ์งํ›„์— 1ํšŒ๋งŒ ๋‚ด์žฅํ•˜์—ฌ ๊ณต์œ ํ•˜๋„๋ก ๊ฐœ์„ .
- **Dictionary Training**: ์—ฌ๋Ÿฌ ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ๋ถ€ํ„ฐ ๊ณตํ†ต ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋ฅผ ๋นŒ๋“œํ•˜์—ฌ `.dict` ํ˜•ํƒœ์˜ ๊ณต์œ  ์‚ฌ์ „์„ ์‚ฌ์ „ ํ•™์Šต(Training)ํ•  ์ˆ˜ ์žˆ๋Š” CLI ๊ธฐ๋Šฅ ์ถ”๊ฐ€.

### 1.7 MZC7 (Context Mixing & Media Filters Spec - ์ตœ์‹  ์‚ฌ์–‘)
- **์•Œ๊ณ ๋ฆฌ์ฆ˜**: ๐Ÿง  ์ปจํ…์ŠคํŠธ ๋ฏน์‹ฑ ๋ ˆ์ธ์ง€ ์ฝ”๋” (CM) + ๐Ÿ–ผ๏ธ PNG Paeth ํ•„ํ„ฐ + ๐ŸŽง LPC ์˜ค๋””์˜ค ํ•„ํ„ฐ + โšก GZIP/DEFLATE ๋””์ฝ”๋”
- **ํ—ค๋” ๊ทœ๊ฒฉ**: 56๋ฐ”์ดํŠธ ๊ณ ์ • ํ—ค๋” (MZC7 ์ „์šฉ ๋น„ํŠธ ํŒจํ‚น ํ”Œ๋ž˜๊ทธ ์ ์šฉ)
- **๋™์ž‘**:
- **Context Mixing Range Coder**: ์ง์ „ ๋น„ํŠธ ๋ฌธ๋งฅ์„ 0์ฐจ, 1์ฐจ, 2์ฐจ(ํ•ด์‹œ ์ง์ ‘ ๋งคํ•‘)๋กœ ๋ถ„ํ•  ๋ถ„์„ํ•˜์—ฌ ๊ฐ€์ค‘์น˜ ํ‰๊ท (1:2:5)์œผ๋กœ ์„ž์–ด ํ™•๋ฅ ์„ ์˜ˆ์ธกํ•˜๊ณ , ์‹ค์ˆ˜ ํ•˜์œ„ ๊ตฌ๊ฐ„์„ ์ชผ๊ฐœ๋Š” ์‚ฐ์ˆ  ๋ ˆ์ธ์ง€ ์ฝ”๋”๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค (`src/cm.rs`).
- **PNG Paeth Filter**: ์ด๋ฏธ์ง€ ํ”ฝ์…€ ๊ฐ„์˜ 2์ฐจ์› ๊ณต๊ฐ„์  ์ค‘๋ณต์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•œ Paeth ๊ทธ๋ผ๋””์–ธํŠธ ์˜ˆ์ธก ํ•„ํ„ฐ๋ฅผ ์ „์ฒ˜๋ฆฌ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
- **LPC Audio Filter**: 16๋น„ํŠธ PCM ์˜ค๋””์˜ค ์‹ ํ˜ธ์˜ ์ธ์ ‘ ์‹œํ€€์Šค ํ๋ฆ„์„ 2์ฐจ ์„ ํ˜• ์˜ˆ์ธก(Order-2 LPC)ํ•˜์—ฌ ๊ทธ ์ž”์ฐจ(Residual) ์ฐจ๋ถ„๋งŒ ์••์ถ•ํ•˜๋„๋ก ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
- **RFC 1951/1952 DEFLATE & GZIP ๋””์ฝ”๋”**: ํ‘œ์ค€ GZIP ํ˜•์‹ ํŒŒ์ผ์˜ ์••์ถ•์„ ํ•ด์ œํ•˜์—ฌ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์›ํ•ด์ฃผ๋Š” ๋””์ฝ”๋” ๋ชจ๋“ˆ์„ ์ˆœ์ˆ˜ Rust๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค (`src/deflate.rs`).

---

## 2. ์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ (Benchmark)

MZC7(์ปจํ…์ŠคํŠธ ๋ฏน์‹ฑ ๋ฐ ๋ฏธ๋””์–ด ํ•„ํ„ฐ) ์‚ฌ์–‘์„ ๊ธฐ์ค€์œผ๋กœ ์—…๊ณ„ ํ‘œ์ค€ ์••์ถ•๊ธฐ(Gzip ๋ฐ Zstandard)์™€ ๋น„๊ตํ•œ ๋ฌด์†์‹ค ์••์ถ•๋ฅ  ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. (๊ฐ ๋ฐ์ดํ„ฐ์…‹ ํฌ๊ธฐ: ์•ฝ 200KB)

| ๋ฐ์ดํ„ฐ์…‹ ๋ถ„๋ฅ˜ | MZC1 (RLE) | MZC3 (LZ77) | MZC7 (Context Mixing) | Gzip (flate2 Default) | Zstd (Level 3) |
| :--- | :---: | :---: | :---: | :---: | :---: |
| ๐Ÿ“ **์ผ๋ฐ˜ ํ…์ŠคํŠธ (Text)** | 100.04% | 6.84% | **9.37%** | 3.35% | 3.49% |
| ๐ŸŽง **์˜ค๋””์˜ค ํŒŒ์ผ (Audio)** | 100.04% | 83.72% | **35.20%** ๐Ÿ† | 75.73% | 70.06% |
| ๐Ÿ–ผ๏ธ **์ด๋ฏธ์ง€ ํŒŒ์ผ (Image)** | 100.04% | 5.85% | **8.20%** | 3.86% | 5.02% |
| ๐Ÿ’ป **์‹คํ–‰ ํŒŒ์ผ (Executable)** | 100.04% | 94.46% | **84.48%** | 82.90% | 75.41% |

> [!TIP]
> **์˜ค๋””์˜ค ๋ฐ์ดํ„ฐ์…‹์˜ ๋…๋ณด์ ์ธ ์••์ถ•๋ฅ **: ์˜ค๋””์˜ค ํŒŒ์ผ(16-bit PCM WAV)์˜ ๊ฒฝ์šฐ, MZC7์— ํƒ‘์žฌ๋œ **LPC(์„ ํ˜• ์˜ˆ์ธก) ํ•„ํ„ฐ**์™€ **์‚ฐ์ˆ  ๋ ˆ์ธ์ง€ ์ฝ”๋”**์˜ ๊ฒฐํ•ฉ์„ ํ†ตํ•ด ์—…๊ณ„ ํ‘œ์ค€์ธ Gzip(75.73%) ๋ฐ Zstd(70.06%) ๋Œ€๋น„ **35.20%**๋ผ๋Š” ์••์ถ• ํšจ์œจ์„ ๋‹ฌ์„ฑํ•˜์—ฌ ์••๋„์ ์ธ ์„ฑ๋Šฅ์  ์šฐ์œ„๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ „์ฒด ํฌ๋งท๋ณ„ ์ƒ์„ธ ๋ฒค์น˜๋งˆํฌ ๋น„๊ต ๋ฐ์ดํ„ฐ๋Š” [๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ ๋ช…์„ธ์„œ](docs/benchmark_results.md)๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

### 2.1 ๋‚ด๋ถ€ Criterion ๋ฒค์น˜๋งˆํฌ (v0.11.1 SIMD ์ตœ์ ํ™”)

v0.11.1์—์„œ ์ ์šฉ๋œ **AVX2/NEON SIMD ๊ฐ€์†** ๋ฐ **Radix Suffix Array** ์ตœ์ ํ™” ํ›„ `cargo bench` ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

| ๋ฒค์น˜๋งˆํฌ | ์†Œ์š” ์‹œ๊ฐ„ | ์ด์ „ ๋Œ€๋น„ ๋ณ€ํ™” | ์ƒํƒœ |
| :--- | :---: | :---: | :---: |
| `compress_text/MZC2_LZ77` | 28.2 ms | **-36.1%** | โœ… ํ–ฅ์ƒ |
| `compress_repeats/MZC2_LZ77` | 6.76 ms | **-59.7%** | โœ… ํ–ฅ์ƒ |
| `compress_text/MZC4_Deflate` | 12.84 ms | **-63.7%** | โœ… ํ–ฅ์ƒ |
| `compress_repeats/MZC4_Deflate` | 6.39 ms | **-67.3%** | โœ… ํ–ฅ์ƒ |
| `compress_text/MZC5_tANS` | 12.99 ms | **-64.2%** | โœ… ํ–ฅ์ƒ |
| `compress_repeats/MZC5_tANS` | 21.78 ms | **-52.7%** | โœ… ํ–ฅ์ƒ |
| `compress_text/MZC7_CM` | 22.66 ms | **-48.5%** | โœ… ํ–ฅ์ƒ |
| `compress_repeats/MZC7_CM` | 10.67 ms | **-51.8%** | โœ… ํ–ฅ์ƒ |
| `micro/bwt_apply` | 1.37 ms | **-67.8%** | โœ… ํ–ฅ์ƒ |
| `micro/cm_compress` | 3.24 ms | **-61.5%** | โœ… ํ–ฅ์ƒ |

> [!NOTE]
> **์ „ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 36~68% ์†๋„ ํ–ฅ์ƒ**: CM ๋ ˆ์ธ์ง€ ์ฝ”๋”์˜ ๊ฐ€์ค‘์น˜ ํ˜ผํ•ฉ ๋ฃจํ”„์— AVX2 `_mm256_mullo_epi32` / NEON `vmulq_s32` SIMD ๋ช…๋ น์–ด๋ฅผ ์ ์šฉํ•˜๊ณ , BWT ์ ‘๋ฏธ์‚ฌ ๋ฐฐ์—ด์„ $O(N \log N)$ Radix Sort ๋ฐฉ์‹์œผ๋กœ ๊ต์ฒดํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

---

## 3. GUI ๋‹ค์ค‘ ํƒญ ๋Œ€์‹œ๋ณด๋“œ ํƒ‘์žฌ

`egui` ๋ฐ `egui_plot`์„ ์ด์šฉํ•œ ํ™”๋ คํ•œ ์‹œ๊ฐ์  GUI ์„ฑ๋Šฅ ์ง„๋‹จ ํ™”๋ฉด์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ƒ๋‹จ ํƒญ์„ ํ†ตํ•ด ๋ชจ๋“œ๋ฅผ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- **Dashboard ํƒญ**:
- **Rayon Thread Occupancy Gauge**: ์••์ถ• ์—ฐ์‚ฐ ์‹œ ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ ์ฝ”์–ด์˜ ์ ์œ ์œจ ์ƒํƒœ๋ฅผ ๋ฐฑ๋ถ„์œจ ํ”„๋กœ๊ทธ๋ ˆ์Šค๋ฐ”๋กœ ์‹œ๊ฐํ™”.
- **์‹ค์‹œ๊ฐ„ Throughput/Ratio Curves**: 1MB ์ฒญํฌ๊ฐ€ ์ฒ˜๋ฆฌ๋  ๋•Œ๋งˆ๋‹ค ์‹ค์‹œ๊ฐ„ ์••์ถ• ์†๋„(MB/s) ๋ฐ ์••์ถ•๋ฅ (%) ๊ณก์„ ์„ ๋ Œ๋”๋ง.
- **๋ฌผ๋ฆฌ์  ์ด์ง„ ๊ทธ๋ฆฌ๋“œ ๋งต**: ๋ณต์›๋œ RLE, ํ† ํฐ, ๋ฐฑ๋ ˆํผ๋Ÿฐ์Šค, ๋ฆฌํ„ฐ๋Ÿด ๋ธ”๋ก์˜ ๊ธฐํ•˜ํ•™์  ๋ถ„ํฌ๋ฅผ ์บ”๋ฒ„์Šค์ƒ์— ์ƒ‰์ƒ ๊ทธ๋ฆฌ๋“œ๋กœ ๋งคํ•‘.
- **Trainer ํƒญ**: ๋‹ค์ˆ˜์˜ ํ…์ŠคํŠธ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜์—ฌ ๋‹ค์šฉ๋„ ๊ณต์œ  ์‚ฌ์ „(`.dict`)์„ ํด๋ฆญ ๋ช‡ ๋ฒˆ์œผ๋กœ ์‰ฝ๊ฒŒ ์ž๋™ ํ•™์Šตํ•˜๊ณ  ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ์  ํŠธ๋ ˆ์ด๋„ˆ ์œ„์ €๋“œ.
- **tANS Plot ํƒญ**: tANS ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋™์ž‘ ์ค‘ ์ž…๋ ฅ ๊ธฐํ˜ธ์— ๋”ฐ๋ฅธ ์ƒํƒœ ์ „์ด(State Transition) ๊ณผ์ •์„ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ธฐํ•˜ํ•™์  ์ขŒํ‘œ ๋…ธ๋“œ ํ”Œ๋กฏ์œผ๋กœ ๋ Œ๋”๋ง ์‹œ๋ฎฌ๋ ˆ์ด์…˜.

---

## 4. ์„ค์น˜ ๋ฐ ๋นŒ๋“œ ๋ฐฉ๋ฒ•

### 4.1 ์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ
- [Rust ๋ฐ Cargo ๋„๊ตฌ ์ฒด์ธ ์„ค์น˜](https://www.rust-lang.org/tools/install) (Edition 2021 ์ง€์›)

### 4.2 ์ตœ์‹  ๋ฆด๋ฆฌ์Šค ๋‹ค์šด๋กœ๋“œ
- ์ตœ์‹  ๋ฒ„์ „: **v0.12.1**
- Windows ์„ค์น˜ ํŒŒ์ผ: [mzc-setup.exe](https://github.com/jeiel85/minimal-zip-concept/releases/download/v0.12.1/mzc-setup.exe)
- ์ „์ฒด ๋ฆด๋ฆฌ์Šค ์ž์‚ฐ: [GitHub Releases](https://github.com/jeiel85/minimal-zip-concept/releases/tag/v0.12.1)

### 4.3 ๋นŒ๋“œ
```bash
# ๋ฆด๋ฆฌ์ฆˆ ์‹คํ–‰ ํŒŒ์ผ ์ปดํŒŒ์ผ (target/release/mzc ์ƒ์„ฑ)
cargo build --release
```

---

## 5. ์‹ค์ œ ๋ช…๋ น์–ด ๊ฐ€์ด๋“œ

MZC ์—”์ง„์€ ์„œ๋ธŒ์ปค๋งจ๋“œ ๊ธฐ๋ฐ˜ CLI ๋ช…๋ น๊ณผ GUI ๋‹จ๋… ์‹คํ–‰ ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

### 5.1 CLI ์••์ถ• (`compress`)
```bash
# MZC5 ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ ์••์ถ• ์‹คํ–‰ (๋ ˆ๋ฒจ 9, Delta ์ „์ฒ˜๋ฆฌ ํ™œ์„ฑํ™”, BCJ ์ „์ฒ˜๋ฆฌ ํ™œ์„ฑํ™”)
./target/release/mzc compress input_file.bin output_file.mzc -m lz77 -e dynamic -l 9 --delta --bcj

# MZC6 tANS ๋ฐ ์‚ฌ์ „ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•œ ์••์ถ• ์‹คํ–‰
./target/release/mzc compress input_file.bin output_file.mzc -m lz77 -e ans -l 6 --dict-file trained.dict

# MZC7 ์ปจํ…์ŠคํŠธ ๋ฏน์‹ฑ ๋ฐ PNG ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ ์••์ถ• ์‹คํ–‰
./target/release/mzc compress input_image.png output_file.mzc -m hybrid -e cm --png
```

### 5.2 CLI ์••์ถ• ํ•ด์ œ (`decompress`)
```bash
# SHA-256 ๊ฒ€์ฆ ๋ฐ ์ž๋™ ๋ฒ„์ „/ํ•„ํ„ฐ ์‹๋ณ„ ๋””์ฝ”๋”ฉ ๋ณต์› (๋‚ด์žฅ ์ „์—ญ ์‚ฌ์ „ ์ž๋™ ์ถ”์ถœ)
./target/release/mzc decompress output_file.mzc restored_file.bin

# ์™ธ๋ถ€ ์‚ฌ์ „์„ ์ง€์ •ํ•˜์—ฌ ํ•ด์ œํ•˜๋Š” ๊ฒฝ์šฐ (์˜ต์…˜)
./target/release/mzc decompress output_file.mzc restored_file.bin --dict-file trained.dict
```

### 5.3 CLI GZIP ์••์ถ• ํ•ด์ œ (`inflate`)
```bash
# ํ‘œ์ค€ GZIP ํฌ๋งท(.gz) ํŒŒ์ผ์˜ ์••์ถ•์„ ํ•ด์ œํ•˜์—ฌ ๋ณต์›
./target/release/mzc inflate archive.gz restored_file.txt
```

### 5.4 CLI ์‚ฌ์ „ ํ•™์Šต (`train`)
```bash
# ๋‹ค์ˆ˜์˜ ์ƒ˜ํ”Œ ํŒŒ์ผ๋“ค๋กœ๋ถ€ํ„ฐ ๊ณตํ†ต ํŒจํ„ด์„ ์ˆ˜์ง‘ํ•˜์—ฌ trained.dict ํŒŒ์ผ๋กœ ํ•™์Šต ์ €์žฅ
./target/release/mzc train samples/*.txt -o trained.dict
```

### 5.5 CLI ํŒŒ์ผ ๊ฒ€์‚ฌ ๋ฐ ์ƒ์„ธ ์ •๋ณด ์ง„๋‹จ (`inspect`)
```bash
./target/release/mzc inspect output_file.mzc
```

### 5.6 ๋ฐ์Šคํฌํ†ฑ GUI ์ง„๋‹จ ๋Œ€์‹œ๋ณด๋“œ ๊ธฐ๋™ (`gui`)
```bash
./target/release/mzc gui
# ๋˜๋Š” cargo run -- gui
```

---

## 6. ์‹คํ–‰ ์˜ˆ์ œ (Examples)

MZC ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ API ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๋„์›€์„ ์ฃผ๋Š” ์‹คํ–‰ ์˜ˆ์ œ ์ฝ”๋“œ๊ฐ€ `examples/` ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

* **๊ธฐ๋ณธ ์ธ๋ฉ”๋ชจ๋ฆฌ ์••์ถ• ์˜ˆ์ œ**: MZC API๋ฅผ ํ™œ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ํ…์ŠคํŠธ๋ฅผ ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.
```bash
cargo run --release --example simple_compression
```
* **๊ณต์œ  ์‚ฌ์ „ ํ•™์Šต ๋ฐ ์••์ถ• ์˜ˆ์ œ**: ์ƒ˜ํ”Œ ๋ง๋ญ‰์น˜๋กœ๋ถ€ํ„ฐ ํŒจํ„ด ์‚ฌ์ „์„ ํ•™์Šต ๋ฐ ์ถ”์ถœํ•˜์—ฌ ์‚ฌ์ „ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค.
```bash
cargo run --release --example shared_dictionary
```
* **์ ์ง„์  ์••์ถ• ๋ฒค์น˜๋งˆํฌ ์ธก์ • ์˜ˆ์ œ**: ํ…์ŠคํŠธ, ์ด๋ฏธ์ง€, ์‚ฌ์šด๋“œ ํŒŒํ˜•, ์‹คํ–‰ ํŒŒ์ผ์— ๋Œ€ํ•ด MZC1๋ถ€ํ„ฐ MZC7๊นŒ์ง€์˜ ์„ฑ๋Šฅ์„ ๋ฒค์น˜๋งˆํ‚นํ•ฉ๋‹ˆ๋‹ค.
```bash
cargo run --release --example benchmark
```

---

## 7. ๊ณต์‹ ๊ธฐ์ˆ  ๊ทœ๊ฒฉ์„œ ๋ฐ ์„ฑ๋Šฅ ์ธก์ • ๋ณด๊ณ ์„œ

* **[MZC ํŒŒ์ผ ํฌ๋งท ์ƒ์„ธ ๊ธฐ์ˆ  ๊ทœ๊ฒฉ์„œ (docs/spec.md)](docs/spec.md)**: MZC1~MZC7์˜ ์ด์ง„ ํ—ค๋” ๋ช…์„ธ, RLE/LZ77/tANS/Context Mixing์˜ ๋น„ํŠธ์ŠคํŠธ๋ฆผ ๊ตฌ์กฐ ๋ฐ ์ „์ฒ˜๋ฆฌ ํ•„ํ„ฐ ์ˆ˜ํ•™ ๊ณต์‹์„ ์ˆ˜๋กํ–ˆ์Šต๋‹ˆ๋‹ค.
* **[MZC ์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฒค์น˜๋งˆํฌ ์„ฑ๋Šฅ ๋ณด๊ณ ์„œ (docs/benchmark_results.md)](docs/benchmark_results.md)**: ๋‹ค์–‘ํ•œ ํŒŒ์ผ ๋„๋ฉ”์ธ(Text, Audio, Image, Executable)์—์„œ์˜ ์••์ถ•๋ฅ  ๋ฐ ์†Œ์š” ์‹œ๊ฐ„์„ ๋ฒค์น˜๋งˆํฌ ํ”„๋กœ๊ทธ๋žจ ๊ตฌ๋™ ๊ฒฐ๊ณผ์™€ ํ•จ๊ป˜ ๊ธฐ๋กํ–ˆ์Šต๋‹ˆ๋‹ค.

---

## 8. ํ•™์Šต์šฉ ์„ค๊ณ„ ์•„ํ‚คํ…์ฒ˜

MZC๋Š” ๋ชจ๋“ˆ ๊ฐ„์˜ ์˜์กด์„ฑ์ด ๋ช…ํ™•ํ•˜์—ฌ Rust์˜ ์—๋Ÿฌ ํ•ธ๋“ค๋ง, ๋น„ํŠธ ์ŠคํŠธ๋ฆผ ๋‹ค๋ฃจ๊ธฐ, GUI ๋ฐ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ํ•™์Šต์— ํ›Œ๋ฅญํ•œ ๊ธธ์žก์ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

```mermaid
graph TD
CLI[src/cli.rs: clap ์ธ์ˆ˜ ํŒŒ์‹ฑ] --> Main[src/main.rs: ์ง„์ž…์ ]
Main --> Lib[src/lib.rs: ํ†ตํ•ฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค]
Lib --> GUI[src/gui.rs: egui ๋ Œ๋”๋Ÿฌ & ๋น„๋™๊ธฐ ํƒœ์Šคํฌ]
Lib --> Format[src/format.rs: ํŒŒ์ผ ํ—ค๋” ๋ถ„๊ธฐ ํŒŒ์„œ]
Lib --> Rle[src/rle.rs: ํŒจํ‚น, ์ง€์—ฐ๋งค์น˜, RLE, LZ77, ํ•„ํ„ฐ ์ฝ”์–ด]
Lib --> Huffman[src/huffman.rs: Dynamic/Static ํ—ˆํ”„๋งŒ ํŠธ๋ฆฌ]
Lib --> Ans[src/ans.rs: tANS ๋ถ€ํ˜ธํ™” ์—”์ง„]
Lib --> CM["src/cm.rs: CM ์‚ฐ์ˆ  ์ฝ”๋” (AVX2/NEON SIMD)"]
Lib --> Filters[src/filters.rs: PNG/LPC ๋ฏธ๋””์–ด ์˜ˆ์ธก ํ•„ํ„ฐ]
Lib --> Deflate[src/deflate.rs: GZIP/DEFLATE ๋””์ฝ”๋”]
Lib --> Checksum[src/checksum.rs: SHA-256 ์ฒดํฌ์„ฌ ๊ณ„์‚ฐ]
Lib --> Inspect[src/inspect.rs: ์ธ์ŠคํŽ™ํ„ฐ ๋ถ„์„ ์—”์ง„]
Lib --> WASM[src/wasm.rs: WebAssembly ๋ฐ”์ธ๋”ฉ]
```