我需要 C# 中的香农法诺算法

发布于 2024-08-29 22:48:31 字数 43 浏览 1 评论 0原文

我需要 C# 中的 Shannon–Fano 算法 有谁可以帮助我吗?

I need Shannon–Fano algorithm in C#
is there any body can help me ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

零度° 2024-09-05 22:48:31

这是我在 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();
}

Here is one I found at http://cppgm.blogspot.com/2008/01/shano-fano-code.html.

I think it should not take too much effort to port it to 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();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文