linux上用c实现算术编码(二)--具体代码

转载注明出处:http://blog.csdn.net/wang_zheng_kai

让学生用开发工具,练习学到的数据压缩编码

本文包括两部分:

linux上用c实现算术编码(一)--具体操作

/*********************************
***Arithmetic coding fixed mode***
*****Writed By Wang Zhengkai******
***********2014.11.24*************
**********************************/

#include<stdio.h>
#include<math.h>
#include<string.h>

char c[20],s[100];
float p[20],f[20],len;
int cord[100];

/**************************************
 * **************encord****************
 * ***********************************/
void encord(int a,int h)
{
	float Fr;
	float Ps=1;
	float Fs=0;
	float cp[100];
	int i,j;

	for(i=0;i<h;i++)
	{
		for(j=0;j<a;j++)
		{
			if(s[i]==c[j])
			{
				cp[i]=p[j];
				Fr=f[j];
			}
		}
	Fs=Fs+Ps*Fr;
 	Ps*=cp[i];
	}

	printf("The result of encord: %f\n",Fs);

	len=log(1/Ps)/log(2);
	if(len>(int)len)
		len=(int)len+1;
	else
		len=(int)len;

	for(i=0;len>i;i++)
	{
		Fs=2*Fs;
		if(Fs>1)
		{
			Fs=Fs-1;
			cord[i]=1;
		}
		else
			if(Fs<1)
				cord[i]=0;
			else
			{
				cord[i]=1;
				break;
			}
	}

	if(i>=len)
	{
		for(j=i;j>=1;j--)
		{
			cord[j-1]=(cord[j-1]+1)%2;
			if(cord[j-1]==1)
				break;
		}
	}

	printf("The resault of encord:\n");
	for(j=0;j<i;j++)
		printf("%d ",cord[j]);
	printf("\n");
}
/**************************************
 * **************decord****************
 * ***********************************/
void decord(int a,int h)
{
	int i,j;
	float Ft,Pt,w=0.5,result=0;
	float Fs=0,Ps=1;

	for(i=0;i<len;i++,w*=0.5)  //two_to_ten
		result += w*cord[i];
	printf("Select the number of decode: %f\n",result);

	printf("The result of decord:\n");
	for(i=0;i<h;i++)
	{
		for(j=a;j>0;j--)
		{
			Ft=Fs;
			Pt=Ps;
         		Ft+=Pt*f[j-1];
			Pt*=p[j-1];
			if(result>=Ft)
			{
				Fs=Ft;
				Ps=Pt;
				printf("%c ",c[j-1]);
				break;
			}
		}
	}
	printf("\n");
}

int main(void)
{
	int num,i,h=0;
	char rub;

/**************************************
 * ****input num of symbols************
 * ***********************************/
	printf("Please input num of character!\n");
	if(1==scanf("%d", &num))
	{
//		printf("%d\n",num);
		rub=getchar();
	}
	else
	{
		rewind(stdin);
		printf("num:input error!\n");
	}

/**************************************
 * ***input sybmol and values**********
 * ***********************************/
	printf("Please input character symbols and their probability values of corresponding!\n");
	for(i=0;i<num;i++)
	{
		printf("Please input character symbols!\n");
		scanf("%c", &c[i]);
		printf("Please input probability values of corresponding!\n");
		scanf("%f", &p[i]);
		rub=getchar();
	}

	for(i=0;i<num;i++)
	{
		printf("<%d>----> %c   ",i,c[i]);
	}
	printf("\n");
	for(i=0;i<num;i++)
	{
		printf("<%d>----> %f   ",i,p[i]);
	}
	printf("\n");

	for(i=1;i<num;i++)
	{
		f[0]=0;
		f[i]=f[i-1]+p[i-1];
	}

/**************************************
 * ******input encord symbol***********
 * ***********************************/
	printf("Please input encord symbols,and input * to exit!\n");
	while(1)
	{
		char ss;
		scanf("%c", &ss);
		rub=getchar();
		if(ss=='*')break;
		s[h++]=ss;
	}
	printf("The numbers of input\n");
	for(i=0;i<h;i++)
	{
	    printf("%c ",s[i]);
	}
	printf("\n");

/**************************************
 * *******encord and dedord************
 * ***********************************/
	printf("............encord............\n ");
  	encord(num,h);
	printf("............decord............\n ");
	decord(num,h);
	return 0;
}
时间: 2024-10-04 21:02:15

linux上用c实现算术编码(二)--具体代码的相关文章

linux上用c实现算术编码(一)--具体操作

转载注明出处:http://blog.csdn.net/wang_zheng_kai 让学生用开发工具,练习学到的数据压缩编码 天津工业大学,信电学院 本文包括两部分: linux上用c实现算术编码(二)--具体代码 ubuntu14.04上用C语言实现算术编码(固定) 1.打开ubuntu14.04系统,界面如下: 2.按Ctrl+Alt+t,打开Terminal,执行命令ls查看算术编码的代码fixed_arithmetic.c 3.执行如下命令,编译代码. 4.生成可执行程序fixed_a

linux上用c实现算术编码(三)--算术编码理论讲解

一.算术编码定义 它是一种非分组编码算法.它是从全序列出发,采用递推形式的连续编码.它不是将单个的信源符号映射成一个码字,而是将整个输入序列的符号依据它们的概率映射为实数轴上区间[0 1)内的一个小区间,再在该小区间内选择一个代表性的二进制小数,作为实际的编码输出. 算术编码不同于霍夫曼码,它是非分组(非块)码.它从全序列出发,考虑符号之间的关系来进行编码. 算术编码利用了累积概率的概念. 算术码主要的编码方法是计算输入信源符号序列所对应的区间. 因为在编码过程中,每输入一个符号要进行乘法和加法

JMeter在linux上分布式压测步骤(二)

哈喽,我又来了~ 前提:三台linux虚拟机,一台作为master,另外两台作为slave. 一.server端 1.修改1099端口,client和server通信的端口,可以不修改,默认就是1099 2.启动jmeter-server (这里启动的时候可以看到ip后面的端口不是1099,这里不用管,1099是client和server的通信端口,和这个没有关系) 二.client端:配置master和slave 1.进入到jmeter的bin目录下,打开jmeter.properties c

如何在Linux上安装Storm

Storm是开源的分布式实时计算系统,能够让数据流处理变得简单.可靠,也因此在大数据领域有广泛的实际 应用.下面介绍一下如何在Linux系统上安装Storm.根据Storm官网介绍,安装Storm软件分五步: 安装Zookeeper. 安装Storm的依赖环境:Java和Python. 下载并解压Storm安装包. 修改必要的Storm配置文件. 启动Storm程序. 一.Storm作为分布式系统,它的运行需要借助Zookeeper来进行协同.因此安装Storm之前需要先安装 Zookeeper

Linux 上安装 weblogic12C (远程图形界面安装) (二)

上一篇Linux 上安装 weblogic12C (静默安装)介绍了静默方式安装weblogic12C的方式,这一篇主要介绍在windows主机上通过远程图形界面的方式安装weblogic的方式 一.前期准备 首先下载软件Xmanager,下载链接点我 (百度网盘),包含了注册码. Xmanager安装过程就不介绍了,一直下一步就行了.安装完成后,有以下快捷方式: 主要用到的是圈起来的这两个程序. 二.开始安装 1. 运行 Xmanager - Passive.exe 2. 通过SSH方式连接l

python批量操作Linux服务器脚本,key登录(执行命令、上传、下载)(二)

1 #-*- coding: utf-8 -*-   2 #批量操作linux服务器(执行命令,上传,下载)   3 #!/usr/bin/python   4 import paramiko   5 import datetime   6 import os   7 import threading   8 def ssh2(ip,username,privatekeyfile,keypwd,cmd):   9     try:  10         paramiko.util.log_to

So Easy! Oracle在Linux上的安装配置系列二

本篇是So Easy!Oracle11gr2在linux上的安装配置的第二篇,本篇将讲述oracle11g r2的安装 oracle安装的前期准备 oracle的安装 工具软件rlwrap-0.42.tar.gz的安装 oracle环境变量设置 文档位置: http://docs.oracle.com/cd/E11882_01/install.112/e24326/toc.htm 1.oracle安装的前期准备 7安装Linux的一些基础开发包 # export LANG=en_US.UTF-8

在Linux上实现一个可用的stateless双向静态NAT模块

关于Linux上如何配置NAT的资料已经不少,可谓铺天盖地!本文与此无关.本文提供一种iptables之外的方式.iptables?不!why?因为iptables配置的NAT是stateful的,它的实现依赖一个叫做conntrack的模块,什么是conntrack?Oh,NO!这可是我的专长,但我不想在本文中说它,认识我的人都知道,我扯这个话题我能扯上12个小时...都还扯不完.也许你不知道什么是stateful NAT,但是如果你是一个有心人,或者说是一个技术还算精湛的Linux网络管理员

Linux运维 第三阶段 (二十) tomcat

一.相关概念(1.编程语言:2.servlet.jsp:3.tomcat): tomcat(app-server server) 为提高tomcat工作性能,前端要引入很多组件(如cache server(varnish)同样对它生效) 1.编程语言: php相关框架.网站程序设计涉及到的基本内容: php: 开发语言,脚本语言,动态语言: 安装的php是个运行环境: 用php开发语言开发网站程序,这个程序在运行环境中解释执行,若每条指令都解释执行.每个用户请求的动态内容都解释执行这将非常慢:在