diff --git a/README.md b/README.md index fe9d8d4..fb1c534 100644 --- a/README.md +++ b/README.md @@ -2,52 +2,18 @@ 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. ``` --- @@ -55,13 +21,22 @@ huffman-compressor/ ## 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). --- @@ -69,80 +44,45 @@ Isso deve gerar os binários `freq_counter` e `compressor` (dependendo do conte 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). -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) diff --git a/docs/design.md b/docs/compressor_md/design.md similarity index 100% rename from docs/design.md rename to docs/compressor_md/design.md diff --git a/docs/report.md b/docs/compressor_md/report.md similarity index 100% rename from docs/report.md rename to docs/compressor_md/report.md diff --git a/examples/codes_test/simple_code.cpp b/examples/codes_test/simple_code.cpp new file mode 100644 index 0000000..012a6d3 --- /dev/null +++ b/examples/codes_test/simple_code.cpp @@ -0,0 +1,15 @@ +#include +#include + +// Um loop simples para testar palavras-chave +int main() { + std::vector 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; +} \ No newline at end of file diff --git a/examples/small_texts/README.md b/examples/small_texts/README.md deleted file mode 100644 index e799938..0000000 --- a/examples/small_texts/README.md +++ /dev/null @@ -1 +0,0 @@ -Small texts to test compression. \ No newline at end of file diff --git a/scripts/generate_dataset.sh b/scripts/generate_dataset.sh deleted file mode 100644 index 8077388..0000000 --- a/scripts/generate_dataset.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash -# scripts/generate_dataset.sh -mkdir -p examples/small_texts -echo "Hello, world!" > examples/small_texts/hello.txt -echo "int main() { return 0; }" > examples/small_texts/sample.cpp -# Add more samples as needed diff --git a/tests/integration/README.md b/tests/integration/README.md deleted file mode 100644 index 9bb35aa..0000000 --- a/tests/integration/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Integration tests - -Add scripts or test harnesses comparing compressors. \ No newline at end of file diff --git a/tests/unit/README.md b/tests/unit/README.md deleted file mode 100644 index c9ec5b5..0000000 --- a/tests/unit/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Unit tests - -Add GoogleTest or Catch2 test files here. \ No newline at end of file