Huffman algoritması ayrık durumları bulunma yüzdelerine göre değişken uzunlukta kodlama esasına dayanır. Gerçek hayattaki veriler çoğunlukla heterojen yapıdadır, ayrık durumların bulunma oranlarının birbirine yakın olmadığı durumlarda bu algoritma ile ortalama kod uzunluğu kısalarak yerden kazanç sağlanabilir.
Bu çalışmada yapılan Huffman algoritmasının basit bir simülasyonu olmakla birlikte herhangi bir sıkıştırma veya ağaç oluşturma söz konusu değildir. Verilen Huffman ağacına bakılarak girilen kod çözümlenmiştir.

Akış Diyagramı:

Kaynak Kodlar:

#include <stdio.h>
#include <stdlib.h>
#define maxSize 50
#define maxCodeLen 50

struct treeNode{
char code;
int number;
};

int main(){
 int i, lastIndex, treeSeeker;
 char isLeaf;
 char codeWord[maxCodeLen];
 struct treeNode huffman[maxSize];
 printf("Enter the last index of the tree:");
 scanf("%d",&lastIndex);
 printf("\nEnter the tree: [enter -1 for null nodes]\n");
 for(i=1;i<=lastIndex;i++)
 {
 printf("\nNumber value at %dth index:",i); scanf("%d",&huffman[i].number);
 if(huffman[i].number==-1) continue;
 printf("Is Leaf?: [y/n] "); fflush(stdin); scanf("%c",&isLeaf);
 if(isLeaf=='y'){
 printf("\nEnter the encoded character: "); fflush(stdin); scanf("%c",&huffman[i].code);
 }
 }

 fflush(stdin);
 printf("\nEnter codeword: "); gets(codeWord);
 treeSeeker=1;
 printf("\n");
 for(i=0;codeWord[i]!='\0';i++){
 if(codeWord[i]=='0'){
 treeSeeker=treeSeeker*2;
 if(huffman[treeSeeker*2].number==-1 || treeSeeker*2>lastIndex){
 printf("%c",huffman[treeSeeker].code);
 treeSeeker=1;
 }
 }
 else if(codeWord[i]=='1'){
 treeSeeker=treeSeeker*2+1;
 if(huffman[treeSeeker*2+1].number==-1 || (treeSeeker*2+1)>lastIndex){
 printf("%c",huffman[treeSeeker].code);
 treeSeeker=1;
 }
 }
 else printf("\nInvalid Character!\n");

 }
 printf("\n"); system("pause");
 return 0;
 }

Siz de yorum ekleyin

Arşivler
Meta