{"id":18308923,"url":"https://github.com/guiribei/huffman_algorithm","last_synced_at":"2026-05-14T20:30:59.770Z","repository":{"id":138865633,"uuid":"588745663","full_name":"Guiribei/huffman_algorithm","owner":"Guiribei","description":"A project to learn about data compression using huffman algorithm and shared memory operations.","archived":false,"fork":false,"pushed_at":"2023-08-31T03:00:29.000Z","size":68,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-08T13:39:57.874Z","etag":null,"topics":["bitwise","bitwise-operators","c","data-compression","linux","memory-management"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Guiribei.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-01-13T22:14:31.000Z","updated_at":"2023-04-09T17:19:54.000Z","dependencies_parsed_at":null,"dependency_job_id":"ae4c8667-6b9b-42bf-abb2-61963fad3be8","html_url":"https://github.com/Guiribei/huffman_algorithm","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Guiribei/huffman_algorithm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guiribei%2Fhuffman_algorithm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guiribei%2Fhuffman_algorithm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guiribei%2Fhuffman_algorithm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guiribei%2Fhuffman_algorithm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Guiribei","download_url":"https://codeload.github.com/Guiribei/huffman_algorithm/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guiribei%2Fhuffman_algorithm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33042057,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"online","status_checked_at":"2026-05-14T02:00:06.663Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bitwise","bitwise-operators","c","data-compression","linux","memory-management"],"created_at":"2024-11-05T16:09:44.210Z","updated_at":"2026-05-14T20:30:59.752Z","avatar_url":"https://github.com/Guiribei.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ca name=\"Data compression\"\u003e\u003c/a\u003e\n\n\u003ch2 align=\"center\"\u003eData Compression\u003c/h2\u003e\n\u003chr\u003e\n  \u003ch4 align=\"center\"\u003e\n    Algoritimo de Huffman e \u003ci\u003eShared Memory Operations\u003c/i\u003e\n    \u003cbr/\u003e\n  \u003c/h4\u003e\n\u003chr\u003e\n\u003c/div\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eSumário\u003c/summary\u003e\n  \u003col\u003e\n    \u003cli\u003e\n      \u003ca href=\"#resumo-do-projeto\"\u003eResumo do Projeto\u003c/a\u003e\n      \u003cul\u003e\n        \u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\n      \u003ca href=\"#fluxo-do-projeto\"\u003eFluxo do projeto\u003c/a\u003e\n      \u003cul\u003e\n        \u003c/a\u003e\u003c/li\u003e\n        \u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#execução\"\u003eExecução\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#principais-fontes\"\u003ePrincipais Fontes\u003c/a\u003e\u003c/li\u003e\n  \u003c/ol\u003e\n\u003c/details\u003e\n\n\n\n## Resumo do Projeto\n\nO desafio da quarta edição do labs era fazer um algoritmo de compressão de Huffman que usasse operações de compartilhamento de memória para trafegar dados de um encoder para um decoder. Durante a semana de prazo para desenvolvimentos a solução criada envolveu a tradução do texto do infile.txt, codificação desse texto, compressão dele e depois descompressão e descodificação.\n\nPrincipais aprendizados:\n* Algoritmos de compressão\n* Construção de árvore binária\n* Codificação (compressão e descompressão) bit a bit\n* Compartilhamento de memória entre programas\n* Otimização de fluxo de código\n\n\nA colaboração foi essencial nesse projeto e destaco principalmente os cadetes: ridalgo- acesar-l fnacarel etachott sguilher mameneze harndt revieira e rleite-s.\n\n\n\n\n## Fluxo do Projeto\n\n\u003cbr/\u003e\n\u003cp align=\"center\"\u003e \u003cimg src=\"https://user-images.githubusercontent.com/85483589/212558718-cb39d641-ce04-454b-a1c5-258d91619a9c.png\"\u003e \u003c/p\u003e\n\u003cbr/\u003e\n\nPara compilar é necessário rodar o makefile. Dois binários são gerados, encoder e decoder. Os dois devem ser sequencialmente executados.\n\u003cbr/\u003e\n\u003cbr/\u003e\nO programa ./encoder vai pegar o conteúdo do arquivo chamado \"infile.txt\", gerar uma tabela de frequência (que é um array de 128 posições) e jogar essa tabela para uma função que ordena de forma crescente os elementos que apareceram na string.\n\u003cbr/\u003e\n\u003cbr/\u003e\nDepois disso, a lista é transformada em uma árvore binária usando uma struct com ponteiros para left e right. A árvore serve para poder gerar um dicionário que dá um código único para cada caractere que aparece no texto a ser codificado. Os caracteres de maior ocorrência recebem uma sequência de zeros e uns menor e os caracteres de menor frequência recebem um código maior.\n\u003cbr/\u003e\n\u003cp align=\"center\"\u003e \u003cimg src=\"https://user-images.githubusercontent.com/85483589/212559922-10695958-a1c0-4163-81ff-71db20908454.png\"\u003e \u003c/p\u003e\n\u003cbr/\u003e\nA árvore de Huffman foi criada para gerar uma codificação menor para os caracteres que têm mais ocorrência. Eles então ficam em níveis mais superiores da árvore, enquanto os caracteres de menor ocorrência ficam em níveis inferiores.\n\n\u003cbr/\u003e\n\u003cp align=\"center\"\u003e \u003cimg src=\"https://user-images.githubusercontent.com/85483589/212559485-308b3f5e-0e13-4e9d-9d6e-91f0c1bb216a.png\"\u003e \u003c/p\u003e\n\u003cbr/\u003e\n\nUma outra função recebe esse código e compacta ele através da manipulação de bits, aglutinando a sequência  de zeros e uns (que é o texto codificado) a cada 8 bits em um byte para poder reduzir o tamanho. O byte que é gerado muitas vezes é um símbolo aleatório (um char entre 0 e 255). Isso é o que de fato comprime a string, fazendo com que se usem menos bytes para poder escrever a mesma quantidade de informação. É importante lembrar que um dos grandes benefícios do algoritmo de Huffman é que ele foi pensado para não perder dados no processo de compactação.\n\n\u003cbr/\u003e\n\u003cp align=\"center\"\u003e \u003cimg src=\"https://user-images.githubusercontent.com/85483589/212559567-b8d2fcc0-a9a8-46e3-afab-32543b72e42b.png\"\u003e \u003c/p\u003e\n\u003cbr/\u003e\n\n\u003cbr/\u003e\n\u003cbr/\u003e\nA string então é enviada por memória compartilhada ao programa ./decoder. O decoder lê do segmento de memória reservado para o compartilhamento tanto a string codificada quanto o dicionário. Daí ela faz a descompressão e depois uma função itera sobre a string transformando-a de volta no texto original usando o dicionário para traduzir.\n\n### Execução\n\nDepois de clonar o repositório, basta rodar os dois programas cada um em um terminal.\n```sh\nmake\n```\n* terminal 1\n  ```sh\n  ./encoder\n  ```\n* terminal 2\n    ```sh\n  ./decoder\n    ```\n\n\u003cbr/\u003e\n\u003cp align=\"center\"\u003e \u003cimg src=\"https://user-images.githubusercontent.com/85483589/212560913-ef8b9d2f-b614-4b67-8183-69667d359ecd.gif\"\u003e \u003c/p\u003e\n\u003cbr/\u003e\n\n## Principais fontes:\n\nAlgoritmo de Huffman: \u003cbr/\u003e\n[https://www.youtube.com/watch?v=o8UPZ_KDWdU\u0026list=PLqJK4Oyr5WShtxF1Ch3Vq4b1Dzzb-WxbP](https://www.youtube.com/watch?v=o8UPZ_KDWdU\u0026list=PLqJK4Oyr5WShtxF1Ch3Vq4b1Dzzb-WxbP)\n\u003cbr/\u003e\n[https://www.geeksforgeeks.org/huffman-coding-greedy-algo-3/](https://www.geeksforgeeks.org/huffman-coding-greedy-algo-3/)\n\u003cbr/\u003e\n[https://www.programiz.com/dsa/huffman-coding](https://www.programiz.com/dsa/huffman-coding)\n\u003cbr/\u003e\n[https://www.youtube.com/watch?v=-TonlL3vcGk](https://www.youtube.com/watch?v=-TonlL3vcGk)\n\u003cbr/\u003e\n\u003cbr/\u003e\nShared Memory Operations: \u003cbr/\u003e\n[https://www.geeksforgeeks.org/ipc-shared-memory/](https://www.geeksforgeeks.org/ipc-shared-memory/)\n\u003cbr/\u003e\n[https://www.tutorialspoint.com/inter_process_communication/inter_process_communication_shared_memory.htm](https://www.tutorialspoint.com/inter_process_communication/inter_process_communication_shared_memory.htm)\n\u003cbr/\u003e\n[https://www.youtube.com/watch?v=rPV6b8BUwxM](https://www.youtube.com/watch?v=rPV6b8BUwxM)\n\u003cbr/\u003e\n\u003cbr/\u003e\nÁrvore Binária: \u003cbr/\u003e\n[https://www.ime.usp.br/~pf/algoritmos/aulas/bint.html](https://www.ime.usp.br/~pf/algoritmos/aulas/bint.html)\n\u003cbr/\u003e\n[https://www.youtube.com/watch?v=z7XwVVYQRAA\u0026list=PL8iN9FQ7_jt7LwqmdiyhVVu2J4jQQ9uRW\u0026index=7](https://www.youtube.com/watch?v=z7XwVVYQRAA\u0026list=PL8iN9FQ7_jt7LwqmdiyhVVu2J4jQQ9uRW\u0026index=7)\n\u003cbr/\u003e\n[https://www.youtube.com/watch?v=UbhlOk7vjVY](https://www.youtube.com/watch?v=UbhlOk7vjVY)\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#Data compression\"\u003evoltar ao início\u003c/a\u003e)\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguiribei%2Fhuffman_algorithm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fguiribei%2Fhuffman_algorithm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguiribei%2Fhuffman_algorithm/lists"}