Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 31 additions & 91 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,147 +2,87 @@

Repositório de exemplo para um projeto em C++ que implementa compressão e descompressão usando o algoritmo de Huffman.
Este repositório contém:
- `freq_counter`: programa que conta frequência de símbolos (bytes) em arquivos.
- `contador_frequencia`: programa que conta frequência de símbolos (bytes) em arquivos.
- `compressor`: compressor/descompressor que usa Huffman.
- Helpers (`BitInputStream`/`BitOutputStream`) para leitura/escrita de bits.
- Scripts para comparar taxa de compressão com gzip/zip/7z.
- `CMake` para facilitar build.
- `CMake` para facilitar build. (Vamos trabalhar nisso)

---

## Estrutura do repositório

```
huffman-compressor/
├─ .github/
│ └─ workflows/ci.yml
├─ cmake/
├─ docs/
│ ├─ report.md
│ └─ design.md
├─ examples/
│ ├─ samples_cpp/
│ └─ small_texts/
├─ include/
│ └─ huffman/
│ ├─ bit_stream.h
│ └─ huffman_tree.h
├─ src/
│ ├─ freq_counter/
│ │ └─ main.cpp
│ ├─ compressor/
│ │ ├─ main.cpp
│ │ ├─ compressor.cpp
│ │ └─ decompressor.cpp
│ └─ lib/
│ ├─ huffman_tree.cpp
│ ├─ bit_stream.cpp
│ └─ utils.cpp
├─ tests/
│ ├─ unit/
│ └─ integration/
├─ scripts/
│ ├─ compare_compressors.sh
│ └─ generate_dataset.sh
├─ CMakeLists.txt
├─ LICENSE.md
├─ README.md
└─ .gitignore
alterar a arvore de estrutura do repo.
```

---

## Como compilar (CMake)

```bash
mkdir -p build
cd build
cmake ..
cmake --build .
Vamos mudar isso ( tem que alterar o cmake para compilar tudo)

enquanto isso...
```
## Como compilar (G++)

```bash

Isso deve gerar os binários `freq_counter` e `compressor` (dependendo do conteúdo do CMakeLists).
g++ -std=c++17 -o contador_frequencia src/freq_counter/main.cpp src/lib/huffman_tree.cpp src/lib/bit_stream.cpp src/lib/utils.cpp -I./include -Wall

g++ -std=c++17 -o compressor src/compressor/main.cpp src/compressor/compressor.cpp src/lib/huffman_tree.cpp src/lib/bit_stream.cpp -I./include -Wall

```


Isso deve gerar os binários `contador_frequencia` e `compressor` (dependendo do conteúdo do CMakeLists).

---

## Uso básico

Contar frequências:
```bash
./freq_counter arquivo1.txt arquivo2.cpp -o frequencies.txt
./contador_frequencia code_test.cpp -o tabela_cpp.freq
```

Comprimir:
```bash
./compressor -c input.txt -o output.huf -t frequencies.txt
./compressor -c -f tabela_cpp.freq -i code_test.cpp -o codigo_comprimido.huff
```

Descomprimir:
```bash
./compressor -d output.huf -o recovered.txt
./compressor -d -i codigo_comprimido.huff -o codigo_restaurado.cpp
```
Caso necessário remover e começar novamente:
```rm -f compressor contador_frequencia tabela_cpp.freq codigo_comprimido.huff codigo_restaurado.cpp ```

---

## Formato sugerido do arquivo `.huf`
Veja a diferença em;
```diff code_test.cpp codigo_restaurado.cpp```

- Header:
- 4 bytes: magic (por exemplo: 'HUF\0')
- 1 byte: versão
- 2 bytes: flags/reservado
- 4 ou 8 bytes: tamanho da serialização da árvore (em bytes)
- bytes: serialização da árvore (pré-order com marcação de folha)
- bytes: payload comprimido (bits concatenados, com padding no último byte)

Detalhes completos e trade-offs em `docs/design.md`.

---

## Roteiro (por onde começar)

1. Crie o repositório remoto (GitHub/GitLab) e faça o clone local.
2. Configure `CMakeLists.txt` mínimo.
3. Implemente `freq_counter`:
- objetivo: contar frequência de cada byte (0-255) e escrever `frequencies.txt`.
4. Implemente `HuffmanTree`:
- construir a árvore a partir das frequências (priority_queue).
- gerar tabela de códigos (map<byte, string>).
5. Implemente `BitOutputStream` / `BitInputStream`:
- escrever/ler bits agrupados em bytes.
6. Implemente `compressor`:
- escrever header + árvore + payload.
7. Implemente `decompressor`:
- ler header, reconstruir árvore, decodificar bits.
8. Testes:
- unitários para contagem, geração de códigos e round-trip de compressão.
9. Experimentos de comparação:
- rode `scripts/compare_compressors.sh` (exemplo) para comparar com `gzip`/`7z`/`zip`.
- documente resultados em `docs/report.md`.
Vale ressaltar que vamos nos programar para alterar e imprimir corretamente na saída que se encontra ```examples/huff_generate/*
Detalhes completos em `docs/`.

---

## Scripts úteis

- `scripts/compare_compressors.sh` — roda compressão com seu `compressor` e também `gzip`, `zip`, `7z`, gerando um CSV com os resultados (original, comprimido, taxa).
- `scripts/generate_dataset.sh` — (opcional) baixa ou copia exemplos para `examples/small_texts/`.


---

## Licença

Este repositório usa MIT por padrão (`LICENSE.md`). Mude se preferir outra licença.
Este repositório usa MIT por padrão (`LICENSE.md`).

---

## Referências e leituras sugeridas

- Artigos/tutorials sobre Huffman Coding (procure por "Huffman coding C++ example")
- Leituras sobre serialização de árvores pré-order com marcação de folhas
- Exemplos de BitStream em C++ (leitura de bits)

---

Se quiser, eu posso:
- Gerar código completo dos stubs (freq_counter, BitStream, HTree) já funcional.
- Criar o arquivo ZIP pronto para download (está sendo gerado agora).

- [Artigo sobre Huffman Coding](https://medium.com/@davidsonbrsilva/compress%C3%A3o-de-dados-pelo-algoritmo-de-huffman-5e04bc437d77#:~:text=O%20c%C3%B3digo%20de%20Huffman%20%C3%A9,que%20isso%20seja%20uma%20regra.)
- [Algoritmo de Huffman](https://youtu.be/BDwtGMhGNc0)
- [Exemplos de BitStream em C++ (leitura de bits)](https://pt.wikipedia.org/wiki/Codifica%C3%A7%C3%A3o_de_Huffman)
File renamed without changes.
File renamed without changes.
15 changes: 15 additions & 0 deletions examples/codes_test/simple_code.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#include <iostream>
#include <vector>

// Um loop simples para testar palavras-chave
int main() {
std::vector<int> vec;
for (int i = 0; i < 10; ++i) {
vec.push_back(i);
}

if (!vec.empty()) {
std::cout << "O vetor nao esta vazio!" << std::endl;
}
return 0;
}
1 change: 0 additions & 1 deletion examples/small_texts/README.md

This file was deleted.

6 changes: 0 additions & 6 deletions scripts/generate_dataset.sh

This file was deleted.

3 changes: 0 additions & 3 deletions tests/integration/README.md

This file was deleted.

3 changes: 0 additions & 3 deletions tests/unit/README.md

This file was deleted.