C++算术编码用到了两个基本的参数:符号的概率和它的编码间隔,信源符号的概率决定压缩编码的效率,也决定编码过程中信源符号的间隔,编码过程中的间隔决定了符号压缩后的输出。
C++算术编码需要输入的是符号,各个符号的概率还有需要编码的符号序列,根据概率可以算出初始编码间隔,先设几个变量在后面可用:High——当前编码的上限,Low——当前编码的下限,high——中间变量,用来计算下一个编码符号的当前间隔的上限,low——中间变量,用来计算下一个编码符号的当前间隔的下限,d——当前间隔之间的距离。
第1个编码符号的当前间隔为其初始的编码间隔,第i个编码符号的当前间隔为第i-1个编码后的[Low,High),第i+1个编码符号的当前间隔算法如下:high=Low+d*第i+1个初始编码符号对应的上限,low=Low+d*第i+1个编码符号对应的下限,然后High=high,Low=low,d=d*第i个编码符号的概率。
编码程序如下:
- #include <iostream.h>
- #define M 100
- #define N 4
- class suanshu
- {
- int count,length;
- char number[N],n;
- long double chance[N],c;
- char code[M];
- long double High,Low,high,low,d;
- public:
- suanshu()
- {High=0;Low=0;}
- void get_number();
- void get_code();
- void coding();
- ~suanshu(){}
- };
- void suanshu::get_number()
- {
- cout<<"please input the number and its chance."<<endl;
- for(int i=0;i<N;i++)
- {
- cin>>n>>c;
- number[i]=n;
- chance[i]=c;
- }
- if(i==20)
- cout<<"the number is full."<<endl;
- count=i;
- }
本C++算术编码在VC6.0和xp专业版下运行通过,这是我个人***次用c++写的比较完整的程序,还有些不尽人意的地方,比如变量和函数命名不太专业,以后会注意,慢慢也会好的。
【编辑推荐】