GithubHelp home page GithubHelp logo

pchampin / huffman Goto Github PK

View Code? Open in Web Editor NEW

This project forked from wagnerf42/huffman

0.0 1.0 0.0 2.41 MB

code for rust tutorial

License: GNU General Public License v3.0

Rust 92.65% Nix 7.35%

huffman's Introduction

  1. lancer cargo run pour tester le code

  2. fn scan_char_frequencies(input: &str) -> HashMap<char, usize>

on cherche a compter le nombre d'apparition de chaque caractere dans l'entree.

indications: utiliser chars et eventuellement entry

  1. fn compress_text(input: &str, codes: &HashMap<char, BitVec>) -> BitVec

etant donne un texte a compresser et une table de hachage contenant le code binaire de chaque caractere, generer le code binaire de de l'entree compressee.

par exemple, si l'entree est aabaabbcab et que les codes sont '0' pour 'a', '10' pour 'b' et '11' pour c on doit obtenir '001000101011010'.

la classe BitVec est definie dans une crate a part.

  1. fn build_huffman_tree(frequencies: &HashMap<char, usize>) -> Box

Etant donne le nombre d'apparition de chaque caractere dans le texte on peut construire un arbre de huffman de la maniere suivante.

un node (classe Node ici) est soit une feuille contenant un caractere, soit un noeud interne contenant exactement 2 enfants.

si on part de a:5, b:4, c:1 on va commencer par creer trois feuilles contenant a, b et c. on groupe les feuilles avec leurs tailles dans des tuples et on insere tout ce beau monde dans un tas (classe BinaryHeap).

a partir de la, l'algorithme est tres simple:

tant que la taille du tas est superieure a 1, on extrait les 2 noeuds de tailles minimales du tas et on les fusionnent en creeant un nouveau noeud interne.

lorsque le tas atteint une taille de 1, alors, il contient la racine de l'arbre.

dans notre exemple on obtient l'arbre suivant :

            /\
           /  \
          a   /\
             /  \
            b    c
  1. fn build_codes(root: &Node) -> HashMap<char, BitVec>

Pour trouver le code d'un caractere il suffit de regarder le chemin de la racine jusqu'a sa feuille. lorsque l'on part a droite on compte '1' et '0' lorsque l'on part a gauche.

dans notre exemple on a donc 'a' qui est code par '0', 'b' par '10' et 'c' par '11'.

  1. fn decompress(&self) -> String

La fonction la plus dure. Etant donne le code du texte et l'arbre, reconstruire le texte initial en parcourant l'arbre depuis la racine pour chaque caractere.

huffman's People

Contributors

wagnerf42 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.