Compression de huffman

Description

salut,
j´ai commencé a programmer en java il ya 3 mois. Actuellement j´essaye de comprendre les arbres biniaire et j'ai reussie a faire se code qui sert a encoder une chaine de characters de n'import quel taille a une chaine binaire mieux compriser
Ps: c'est mont premier code et je veux l'amiliore plutart avec une interface grafique et une comprission reel es fichier ,alors attendez la versin prochaine

Source / Exemple :


/*

  • le princile de fonctionement des arbres du compression Huffman
  • du compression Huffman
  • /
/*
  • HuffmanExe.java
*
  • Created on 11 déc. 2010, 09:40:22
  • /
/** *
  • @author MouMouH206
  • /
import java.util.*; public class HuffmanExe { static Huffman huffman; private static Scanner input = new Scanner(System.in); private static String value; public static void main(String args[]) { System.out.print("Enter String: "); try{ value = input.nextLine(); System.out.println("This is the value you entered: "+value); huffman = new Huffman(value); System.out.println("The bit representation of the String you entered is: "+huffman.hC.finalBitPattern); } catch(Exception e){ System.out.println("Error"); } } } //////Huffman.java public class Huffman { // private static String value; private static char charArray[]; //pour convertir la chaine en charactaires. private static int table[] = new int[255]; //remplis avec les frequence de chara.. private static Node myNode[]; //Les noeud private static int lengthOfTable = 0; private static Node myTree; private static int lengthOfNode = 0; public static HuffmanTransversor hC; public Huffman(String value)// resever la String entrer par l'utilisateur et le metre en valeur "valeu" { frequencyTable(value);//appele la methode " frequencyTable()" et envoier le valeur recu pour calculer le nombre d'ocurence nodeArrange();//appele de method "nodeArrange" our cree des objet neud pour chaque lettre Node x = createTree(); hC = new HuffmanTransversor(x,charArray); } public static void frequencyTable(String value)//la methode respensable pour calcule de nombre d'occurence des lettres { charArray = value.toCharArray();//convertir le signal en charactere avec la .toCharArray et enregistrer le ds un tableu "charArray"(chaque caractere ds une case) for(int i = 0; i < charArray.length; i++){//balier tous les character present ds le tableux int chara=(int)charArray[i];// convertir chaque character en decimale ++table[chara] ;//incrimenter le conteur chaque fois que un caracter s'affiche } } public static void nodeArrange() { int counter = 0; for(int i = 0; i < table.length; i++) { if(table[i]>0) counter++; } lengthOfTable = counter; counter = 0; myNode = new Node[lengthOfTable]; for(int i = 0; i < 255; i++) { if(table[i] != 0) { myNode[counter]= new Node(table[i], (char)i, null, null); counter++; } } lengthOfNode = myNode.length; sort(); } public static Node createTree() { for(int i = 1; i < lengthOfNode; i++) { try {myTree = new Node(); if(myNode[1].frequency >= myNode[0].frequency) { myTree.addNode(myNode[0],myNode[i]); myNode[0] = myTree; moveItems(i, lengthOfNode); lengthOfNode -= 1; i -= 1; sort(); } else { myNode[1] = myNode[i]; myNode[0] = myTree.addNode(myNode[0], myNode[1]); } } catch(Exception e) { //I dare this program to crash...hahaha } } return myNode[0]; } private static void moveItems(int index, int length) { try { for(int i = index; i < length; i++) myNode[i] = myNode[i+1]; } catch(Exception e) { //See...this program is uncrashable...lol } } private static void sort() { Node temp; for(int i = lengthOfNode-1; i > 1; i--) { for(int j = 0; j < i; j++) { if(myNode[j].frequency > myNode[j+1].frequency) { temp = myNode[j+1]; myNode[j+1] = myNode[j]; myNode[j] = temp; } } } } } /////Node.java public class Node { public int frequency; public char c; public Node left; public Node right; public Node(int frequency, char c, Node left, Node right) { this.frequency = frequency; this.c = c; this.left = left; this.right = right; } public Node() { //does Nothing } public Node addNode(Node node1, Node node2) { if(node1.frequency < node2.frequency) { left = node1; right = node2; } else { right = node1; left = node2; } frequency = node1.frequency + node2.frequency; return this; } } //////HuffmanTransversor.java public class HuffmanTransversor { private Node rootNode; public String finalBitPattern = ""; public HuffmanTransversor(Node myNode, char [] charArray) { String temp; int i; rootNode = myNode; for(i = 0; i < charArray.length; i++) { temp = search(rootNode, "", charArray[i]); finalBitPattern += temp+" "; System.out.println("My values: "+charArray[i]+" "+temp); } // System.out.println("My final Bit Pattern: "+finalBitPattern); } public String search(Node rootNode, String value,char myChar) { String valueL =""; if(rootNode != null) { if(rootNode.left != null) valueL = search(rootNode.left, value+"0", myChar); if(rootNode.c == myChar) return value; else { if(valueL == "") { return search(rootNode.right, value+"1",myChar); } else { return valueL; } } } else { return ""; } } }

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.