算术编码的C实现

  • 格式:doc
  • 大小:23.50 KB
  • 文档页数:5

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算术编码的C++实现

#include

#include

#include

#include

using namespace std;

#define N 50 //输入的字符应该不超过50个

struct L //结构用于求各字符及其概率

{

char ch; //存储出现的字符(不重复)

int num; //存储字符出现的次数

double f;//存储字符的概率

};

//显示信息

void disp();

//求概率函数,输入:字符串;输出:字符数组、字符的概率数组;返回:数组长度;

int proba(string str,char c[],long double p[],int count);

//求概率的辅助函数

int search(vector arch,char,int n);

//编码函数,输入:字符串,字符数组,概率数组,以及数组长度;输出:编码结果

long double bma(char c[],long double p[],string str,int number,int size);

//译码函数,输入:编码结果,字符串,字符数组,概率数组,以及它们的长度;输出:字符串

//该函数可以用于检测编码是否正确

void yma(string str,char c[],long double p[], int number,int size,long double input);

int main()

{

string str; //输入要编码的String类型字符串

int number=0,size=0; //number--字符串中不重复的字符个数;size--字符串长度char c[N]; //用于存储不重复的字符

long double p[N],output; //p[N]--不重复字符的概率,output--编码结果

disp();

cout<<"输入要编码的字符串:";

getline(cin,str); //输入要编码的字符串

size=str.length(); //字符串长度

number=proba(str,c,p,size);//调用求概率函数,返回不重复字符的个数

cout.setf(ios::fixed); //“魔法配方”规定了小数部分的个数

cout.setf(ios::showpoint); //在此规定编码结果的小数部分有十个

cout.precision(10);

output=bma( c, p, str, number, size);//调用编码函数,返回编码结果

yma(str,c, p, number, size, output); //调用译码函数,输出要编码的字符串,

//以验证编码是否正确

return 0;

}

//显示信息

void disp()

{

cout<

cout<<"********************算术编码*********************\n";

cout<<"*****************作者:heiness******************\n";

cout<

cout<<"此程序只需要输入要编码的字符串,不需要输入字符概率\n";

cout<

}

//求概率函数

int proba(string str,char c[],long double p[], int count)

{

cout.setf(ios::fixed); //“魔法配方”规定了小数部分位数为三位

cout.setf(ios::showpoint);

cout.precision(3);

vectorpt; //定义了结构类型的向量,用于同时存储不重复的字符和其概率

L temp; //结构类型的变量

temp.ch = str[0]; //暂存字符串的第一个字符,它的个数暂设为1

temp.num=1;

temp.f=0.0;

pt.push_back(temp); //将该字符及其个数压入向量

for (int i=1;i

{

temp.ch=str[i]; //暂存第二个字符

temp.num=1;

temp.f=0.0;

for (int j=0;j

{ //若重复,该字符个数加1,并跳出循环int k; //若不重复,则压入该字符,并跳出循环

k=search(pt,str[i],pt.size());

if(k>=0)

{

pt[k].num++;

break;

}

else

{

pt.push_back(temp);

break;

}

}

}

for (i=0;i

{

pt[i].f=double(pt[i].num)/count;

}

int number=pt.size(); //计算不重复字符出现的次数cout<<"各字符概率如下:\n";

for (i=0;i

if (count==0)

{

cout<<"NO sample!\n";

}

else

{

c[i]=pt[i].ch;

p[i]=pt[i].f;

cout<

}

}

return number; //返回不重复字符的个数

}

//求概率的辅助函数

//若搜索发现有重复字符返回正数

//否则,返回-1

int search(vector arch,char ch1,int n)

{

for (int i=0;i

if(ch1==arch[i].ch) return i;

return -1;

}

//编码函数

long double bma(char c[],long double p[],string str,int number,int size)

{

long double High=0.0,Low=0.0,high,low,range;

//High--下一个编码区间的上限,Low--下一个编码区间的下限;

//high--中间变量,用来计算下一个编码区间的上限;

//low--中间变量,用来计算下一个编码区间的下限;

//range--上一个被编码区间长度

int i,j=0;

for(i=0;i

if(str[0]==c[i]) break; //编码第一个字符

while(j

Low+=p[j++]; //寻找该字符的概率区间下限

相关主题