Arithmetic Encoding(压缩算法)
来源:互联网 发布:python 聚合搜索 编辑:程序博客网 时间:2024/06/06 04:08
关于算术编码的介绍请见CSDN上Gjack的博客。http://blog.csdn.net/Gjack/archive/2010/01/15/5193754.aspx
#include<iostream>
#include<map>
#include<string>
#include<cassert>
#include<utility>
using namespace std;
int main(int argc,char **argv)
{
double High=1.0;
double Low=0.0;
string original="CADACDB";
//create a map to store all chars and it's occurrence frequency
map<char,double> char_freq;
char_freq.insert(make_pair('A',0.1));
char_freq.insert(make_pair('B',0.4));
char_freq.insert(make_pair('C',0.2));
char_freq.insert(make_pair('D',0.3));
//compute HighRanges and LowRanges for each char
map<char,pair<double,double> > char_range;
map<char,double>::const_iterator iter=char_freq.begin();
double floor=Low;
while(iter!=char_freq.end())
{
char_range[iter->first].first=floor;
floor+=iter->second;
char_range[iter->first].second=floor;
++iter;
}
//the core code to compress
for(string::size_type i=0;i<original.size();i++)
{
char temp=original[i];
assert(char_freq.count(temp));
double Range=High-Low;
High=Low+Range*char_range[temp].second;
Low=Low+Range*char_range[temp].first;
}
double result=(Low+High)/2;
cout<<"Compression Result: "<<result<<endl;
//the core code to decompress
Low=0.0;
High=1.0;
bool goon=true;
cout<<"Original Text: ";
do{
map<char,pair<double,double> >::const_iterator itr=char_range.begin();
while(itr!=char_range.end())
{
double Range=High-Low;
if((result-Low)/Range>itr->second.first && (result-Low)/Range<itr->second.second)
{
cout<<itr->first;
High=Low+Range*itr->second.second;
Low=Low+Range*itr->second.first;
break;
}
++itr;
}
if(itr==char_range.end())
goon=false;
}while(goon);
cout<<endl;
return 0;
}
- Arithmetic Encoding(压缩算法)
- 行程长度压缩算法(Run Length Encoding)
- 算法(arithmetic)
- RLE(run length encoding)行程长度压缩算法
- http accept-encoding详解 HTTP协议-压缩(gzip,deflate)
- arithmetic 冒泡算法
- 算法第七周 Arithmetic Slices
- 指定“Vary: Accept-Encoding”标头 --压缩
- 算法练习(字符串压缩)
- Encoding 常用編碼代號(C# Encoding.GetEncoding)
- Large number arithmetic and DH algorithm(大整数的运算与DH算法的实现)
- 扩展欧几里得算法,中国剩余定理(Two Arithmetic Progressions,cf 710D)
- Simulate Anneal Arithmetic (SAA,模拟退火算法)
- *Simulate Anneal Arithmetic (SAA,模拟退火算法)
- 算法课第九周作业 | Arithmetic Slices
- Arithmetic Slices动态规划算法详解
- 【算法作业14】LeetCode 413. Arithmetic Slices
- (算法分析Week14)Arithmetic Slices[Medium]
- const学习大总结
- 排序
- 随机数的生成
- Linux内存管理
- 从文件中查找单词
- Arithmetic Encoding(压缩算法)
- 拓扑排序
- Linux常用命令
- 全局变量用常量初始化----C和C++的不同
- 动态创建和释放二维数组
- Oracle 10g 物理Dataguard日常操作维护(二)
- Linux下利用多线程实现矩阵相乘的并行计算
- 动态规划--买书怎么组合花钱最少
- 调用Google API做自己的翻译工具