rss· 投稿· 设为首页· 加入收藏· 繁體版
当前位置: 火魔网 » 程序开发 » Java基础

shannan编码的java代码

import java.util.Scanner;
import java.lang.Math;
public class shannan          public static void main(String args[])          int i,j;
         float num=0.0f;
         int m_n;
         Scanner scan=new Scanner(System.in);
         System.out.printf("编码符号个数为:");
         m_n=scan.nextInt();
         float m_p[]=new float[m_n];
         float m_sp[]=new float[m_n];
         float m_length[]=new float[m_n];          for(i=0;i<m_n;i++)          System.out.printf("第"+i+"个概率为:");
         m_p[i]=scan.nextFloat();
         num=num+m_p[i];          if(num!=1)
         System.out.println("所输入的概率不为零");
           else               //给概率排序//
              for(i=0;i<m_n;i++)                  for(j=i+1;j<m_n;j++)                     if(m_p[j]>m_p[i])                      float tmp=m_p[i];
                     m_p[i]=m_p[j];
                     m_p[j]=tmp;                   }                               m_sp[0]=0.0f;
               for(i=0;i<m_n-1;i++)                m_sp[i+1]=m_p[i]+m_sp[i];
               int k=i+1;                                 float a=(float)(-1.0/Math.log(2));
                for(i=0;i<m_n;i++)                 float inf=(float)(a*Math.log((double)m_p[i]));
                m_length[i]=(int)inf;
                if((float)m_length[i]<inf)
                ++m_length[i];
                }

              System.out.println("-=-=-=-=-=-=-\n香农编码结果:\n-=-=-=-=-=-=-\n");
              System.out.printf("消息序号si 消息概率p(si) 累加概率Pi 代码组长度li 二进制代码组\n");
              for(i=0;i<m_n;++i)                  System.out.printf(i+1+"\t\t"+m_p[i]+"\t\t"+m_sp[i]+"\t"+m_length[i]+"\t\t");
                 double sum1;
                 sum1=0;
                 for (j=1;j<=m_length[i];j++)                    sum1=sum1+(double)Math.pow(2,-j);
                   if(sum1>m_sp[i])                     System.out.printf("0");
                    sum1=sum1-(double)Math.pow(2,-j);                     else
                    System.out.printf("1");                    System.out.printf("\n");         float H=0.0f;
        float L=0.0f;
        float H1,L1;
        for(i=0;i<m_n;i++)           float b=(float) (Math.log(m_p[i]));
          H1=m_p[i]*a*b;
          H=H+H1;
          L1=m_p[i]*m_length[i];
          L=L1+L;          float w=H/L;
        System.out.println("信源熵为:"+H);
        System.out.println("平均码长为:"+L);
        System.out.println("编码效率为:"+w);
               }

          }
}

顶一下
(0)
踩一下
(0)