算术编码(固定模式C语言)代码
#include<math.h> #include<string.h> #include<stdio.h> const double proc[]={0.10,0.10,0.10,0.1,0.1,0.1,0.1,0.1,0.15,0.05}; double result,areaBegin,areaEnd; int cord[1000],cordLength; char str[1000]; int strLength=0; bool readdat(){ printf("*********** 固定模式算术编码 ***********\n"); printf("请输入字符串(0--9): \n"); scanf("%s",str); while(str[strLength]!='\0') strLength++; for(int i=0;i<strLength;i++) //输入是否合法 if(str[i]>'9' || str[i]<'0') return 1; return 0;。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。下载吧。。。 根据给定的文件信息,我们可以总结出以下关于“算术编码(固定模式C语言)代码”的相关知识点: ### 一、算术编码简介 算术编码是一种无损数据压缩技术,它通过对源符号的概率分布进行建模来实现高效的数据表示。与霍夫曼编码等其他压缩方法相比,算术编码在压缩效率上往往更高,尤其是在处理具有较低熵的数据时。算术编码的核心思想是将源符号序列映射到一个区间内,该区间的长度反映了源符号的概率分布。 ### 二、代码分析 #### 1. 概念定义与初始化 代码首先定义了一个概率数组`proc[]`,其中每个元素代表了字符`0`到`9`出现的概率。例如,字符`0`出现的概率为`0.10`,而字符`9`出现的概率则为`0.05`。此外,还定义了一些变量用于存储编码过程中的中间结果,如`result`、`areaBegin`、`areaEnd`等。 ```c const double proc[]={0.10,0.10,0.10,0.1,0.1,0.1,0.1,0.1,0.15,0.05}; double result, areaBegin, areaEnd; int cord[1000], cordLength; char str[1000]; int strLength = 0; ``` #### 2. 输入验证 通过`readdat()`函数读取用户输入的字符串,并检查其合法性。只有当输入完全由数字`0`到`9`组成时,程序才会继续执行。 ```c bool readdat() { printf("请输入字符串(0--9): \n"); scanf("%s", str); while (str[strLength] != '\0') strLength++; for (int i = 0; i < strLength; i++) // 输入是否合法 if (str[i] > '9' || str[i] < '0') return 1; return 0; } ``` #### 3. 编码过程 `encord()`函数实现了算术编码的过程。对于输入的每一个字符,计算出当前概率区间内的编码值,并更新区间的范围。最后输出编码后的二进制序列。 ```c void encord() { printf("编码:"); double w = 0.0, len; areaBegin = 0.0, areaEnd = 1.0; for (int i = 0; i < strLength; i++) { int n = str[i] - '0', k; w = 0.0; for (k = 0; k < n; k++) w += proc[k]; len = areaEnd - areaBegin; areaEnd = areaBegin + len * (w + proc[k]); areaBegin += len * w; } result = areaBegin * 0.01 + areaEnd * 0.99; cordLength = (int)(-log(areaEnd - areaBegin) / log(2)) + 1; printf("编码位数: %d\n", cordLength); printf("编码:"); double temp1 = result; int temp2; for (int j = 0; j < cordLength; j++) { temp1 *= 2; temp2 = int(temp1); temp1 -= temp2; cord[j] = temp2; printf("%d", temp2); } printf("\n"); } ``` #### 4. 解码过程 `decord()`函数负责解码,即将编码后的二进制序列转换回原始的字符序列。解码过程与编码过程类似,但方向相反,逐步缩小概率区间直到找到对应的字符。 ```c void decord() { printf("解码:\n"); result = 0.0; double wei = 0.5; for (int i = 0; i < cordLength; i++, wei *= 0.5) result += wei * cord[i]; printf("选择%f\n", result); areaBegin = 0.0, areaEnd = 1.0; wei = 0.0; int temp; double len; for (int j = 0; j < strLength; j++) { temp = 0; wei = 0.0; len = areaEnd - areaBegin; while (result - areaBegin > wei * len) { wei += proc[temp++]; } temp--; areaEnd = areaBegin + wei * len; areaBegin = areaBegin + (wei - proc[temp]) * len; printf("%d", temp); } printf("\n"); } ``` ### 三、总结 本篇代码示例提供了一个简单的算术编码实现,通过定义字符出现的概率,并基于这些概率对输入字符串进行编码和解码操作。需要注意的是,算术编码的效果依赖于概率模型的准确性,因此实际应用中需要根据具体情况调整模型参数以获得更好的压缩效果。
#include<math.h>
#include<string.h>
#include<stdio.h>
const double proc[]={0.10,0.10,0.10,0.1,0.1,0.1,0.1,0.1,0.15,0.05};
double result,areaBegin,areaEnd;
int cord[1000],cordLength;
char str[1000];
int strLength=0;
bool readdat(){
printf("*********** 固定模式算术编码 ***********\n");
printf("请输入字符串(0--9): \n");
scanf("%s",str);
while(str[strLength]!='\0')
strLength++;
for(int i=0;i<strLength;i++) //输入是否合法
if(str[i]>'9' || str[i]<'0') return 1;
return 0;
}
void encord(){
printf(" 编 码 :");
double w=0.0,len;
areaBegin=0.0,areaEnd=1.0;
for(int i=0;i<strLength;i++){
int n=str[i]-'0',k; w=0.0;
for(k=0;k<n;k++) w += proc[k]; //计算所在区间
len=areaEnd-areaBegin; //计算新的区间
areaEnd = areaBegin+len*(w+proc[k]);
areaBegin += len*w;
- longtulaozi2015-04-30带我仔细研究学习,感谢分享
- 粉丝: 0
- 资源: 20
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助