2010-04-24 57 views
2

我需要Shannon-Fano算法在C# 有没有任何机构可以帮助我?我需要香农Fano算法在C#

+5

您是否试过联系香农或法诺? :-) – paxdiablo 2010-04-24 10:01:21

+0

@paxdiablo:香农在2001年去世了,法诺还活着;) – abatishchev 2010-04-24 10:02:32

+2

不,我没有尝试,我需要它尽快 我该如何联系他们? – 2010-04-24 10:03:08

回答

0

这是我在http://cppgm.blogspot.com/2008/01/shano-fano-code.html找到的一个。

我认为它不应该花太多努力将其移植到C#。

#include< stdio.h> 
#include< conio.h> 
#include< string.h> 
struct node 
{ 
    char sym[10]; 
    float pro; 
    int arr[20]; 
    int top; 
}s[20]; 

typedef struct node node; 

void prints(int l,int h,node s[]) 
{ 
    int i; 
    for(i=l;i< =h;i++) 
    { 
     printf("\n%s\t%f",s[i].sym,s[i].pro); 
    } 
} 

void shannon(int l,int h,node s[]) 
{ 
    float pack1=0,pack2=0,diff1=0,diff2=0; 
    int i,d,k,j; 
    if((l+1)==h || l==h || l>h) 
    { 
     if(l==h || l>h) 
    return; 
     s[h].arr[++(s[h].top)]=0; 
     s[l].arr[++(s[l].top)]=1; 
     return; 
    } 
    else 
    { 
     for(i=l;i< =h-1;i++) 
    pack1=pack1+s[i].pro; 
     pack2=pack2+s[h].pro; 
     diff1=pack1-pack2; 
     if(diff1< 0) 
    diff1=diff1*-1; 
     j=2; 
     while(j!=h-l+1) 
    { 
     k=h-j; 
     pack1=pack2=0; 
     for(i=l;i< =k;i++) 
     pack1=pack1+s[i].pro; 
     for(i=h;i>k;i--) 
     pack2=pack2+s[i].pro; 
     diff2=pack1-pack2; 
     if(diff2< 0) 
     diff2=diff2*-1; 
     if(diff2>=diff1) 
     break; 
     diff1=diff2; 
     j++; 
    } 
     k++; 
     for(i=l;i< =k;i++) 
    s[i].arr[++(s[i].top)]=1; 
     for(i=k+1;i< =h;i++) 
    s[i].arr[++(s[i].top)]=0; 
     shannon(l,k,s); 
     shannon(k+1,h,s); 
    } 
} 

void main() 
{ 
    int n,i,j; 
    float x,total=0; 
    char ch[10]; 
    node temp; 
    clrscr(); 
    printf("Enter How Many Symbols Do You Want To Enter\t: "); 
    scanf("%d",&n); 
    for(i=0;i< n;i++) 
    { 
     printf("Enter symbol %d ---> ",i+1); 
     scanf("%s",ch); 
     strcpy(s[i].sym,ch); 
    } 
    for(i=0;i< n;i++) 
    { 
     printf("\n\tEnter probability for %s ---> ",s[i].sym); 
     scanf("%f",&x); 
     s[i].pro=x; 
     total=total+s[i].pro; 
     if(total>1) 
    { 
     printf("\t\tThis probability is not possible.Enter new probability"); 
     total=total-s[i].pro; 
     i--; 
    } 
    } 
    s[i].pro=1-total; 
    for(j=1;j< =n-1;j++) 
    { 
     for(i=0;i< n-1;i++) 
    { 
     if((s[i].pro)>(s[i+1].pro)) 
     { 
      temp.pro=s[i].pro; 
      strcpy(temp.sym,s[i].sym); 
      s[i].pro=s[i+1].pro; 
      strcpy(s[i].sym,s[i+1].sym); 
      s[i+1].pro=temp.pro; 
      strcpy(s[i+1].sym,temp.sym); 
     } 
    } 
    } 
    for(i=0;i< n;i++) 
    s[i].top=-1; 

    shannon(0,n-1,s); 
    printf("---------------------------------------------------------------"); 
    printf("\n\n\n\tSymbol\tProbability\tCode"); 
    for(i=n-1;i>=0;i--) 
    { 
     printf("\n\t%s\t%f\t",s[i].sym,s[i].pro); 
     for(j=0;j< =s[i].top;j++) 
    printf("%d",s[i].arr[j]); 
    } 
    printf("\n---------------------------------------------------------------"); 
    getch(); 
} 
+0

@phimuemue:谢谢你 但我看到这个代码 我需要这样的一个在C# – 2010-04-24 10:46:24

+2

@Majed:是的,你可能必须做一些实际*工作*在这一个。 – Joe 2010-04-24 11:42:03

+0

为什么你不把它粘贴到你的C#代码然后一步一步地适应它? – phimuemue 2010-04-24 12:22:34