游程编码问题

游程编码问题
请实现游程编码的编码函数和解码函数。
提示:游程编码的概念是,
给一块数据,如:0x11 0x11 0x11 0x22 0x33 0x33 0x33 0x33 0x33,
那么游程编码的结果是:0x11 0x3 0x22 0x1 0x33 0x5

//主函数

 1 #include <stdio.h>
 2
 3 //函数声明
 4 extern void *coding(void *string,int *num);            //编码函数
 5 extern void *de_data(void *string,int *num);        //解码函数
 6
 7 int main()
 8 {
 9     //编码动作
10     int num,i=0;
11
12     unsigned char buf[]={0x11,0x11,0x11,0x22,0x33,0x33,0x33,0x33,0x33};
13     num = sizeof(buf)/sizeof(buf[0]);
14
15     //打印原码
16     printf("The original code is:\n");
17     for(i=0;i<num;i++)
18     {
19         printf(" 0x%x",buf[i]);
20     }
21     printf("\n");
22
23     unsigned char *cod_data;        //定义一个接收编码的空间
24     cod_data=coding(buf,&num);        //调用编码函数
25
26     //打印编码
27     printf("After the coding is:\n");
28     for(i=0;i<num;i++)
29     {
30         printf(" 0x%x",cod_data[i]);
31     }
32     printf("\n");
33
34    //解码动作
35     unsigned char *decode_data;      //定义一个接收解码的空间
36     decode_data = de_data(cod_data,&num);    //调用解码函数
37
38    //打印解码
39     printf("After decoding is:\n");
40     for(i=0;i<num;i++)
41     {
42         printf(" 0x%x",decode_data[i]);
43     }
44     printf("\n");
45
46     free(cod_data);
47     free(decode_data);
48
49     return 0;
50 }

//加码动作

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 /*************************************************************************
 4 read_len:原码长度
 5 count:1,原码中不相等值的个数 2,计算原码中相邻相等值的个数
 6 teamdata:临时存放空间
 7 read_data:指向原码空间
 8 cod_data:指向编码空间
 9 **************************************************************************/
10
11 void *coding(void *string,int *num)
12 {
13     int i=1,count=1;
14     int read_len;
15     unsigned char *read_data = (unsigned char *)string;
16     read_len = *num;
17     unsigned char teamdata;
18     unsigned char *code_data;
19
20     if(read_data == NULL)
21     {
22         return NULL;
23     }
24
25 //计算编码后所需要的空间的大小
26     teamdata = read_data[0];
27     for(i=1;i<read_len;i++)
28     {
29         if(teamdata != read_data[i])
30         {
31             count++;
32             teamdata = read_data[i];
33         }
34     }
35
36     code_data = (unsigned char *)malloc(count*2);
37
38     if(code_data == NULL)
39     {
40         return NULL;
41     }
42
43     *num = count*2;            //将原码长度指向编码后的长度
44     count = 1;
45     int code_len = 0;
46
47 //编码动作
48     code_data[code_len++]=read_data[0];
49     teamdata = read_data[0];
50     for(i=1;i<read_len;i++)
51     {
52         if(teamdata != read_data[i])
53         {
54             code_data[code_len++] = count;
55             code_data[code_len++] = read_data[i];
56             teamdata = read_data[i];
57             count = 1;
58             continue;
59         }
60         else
61         {
62             count++;
63         }
64         code_data[code_len] = count;
65     }
66
67 //下面我用code_data两次一个循环来保存编码后的值,也可以实现成功编码,
68
69 /*
70 i = 0;
71 for(i=0;i<read_len;i++)
72 {
73     if(read_data[i+1] != read_data[i])
74     {
75         code_data[code_len] = read_data[i];
76         code_data[code_len+1] = count;
77         code_len = code_len + 2;
78         count = 1;
79     }
80     else
81     {
82         count++;
83     }
84 }
85 */
86     return code_data;
87 }

//解码动作

#include<stdio.h>
#include<stdlib.h>
/*************************************************************************
cod_len:原码长度
count:解码后长度
ret_len:原码中相邻并值相同的个数
decode:原码指向空间
ret_data:解码后指向空间
**************************************************************************/

void *de_data(void *string,int *num)
{
    int cod_len,i=1;
    cod_len = *num;
    unsigned char *decode = (unsigned char *)string;
    if(decode == NULL)
    {
        return NULL;
    }

    int count = 0;
    unsigned char *ret_data;

    for(i=1;i<cod_len;i=i+2)
    {
        count += decode[i];
    }

    *num = count;
    ret_data = (unsigned char *)malloc(count);
    if(ret_data == NULL)
    {
        return NULL;
    }

//解码动作
    count = 0;
    i = 0;
    int ret_len = 0,j = 0;
    for(i=0;i<cod_len;i=i+2)
    {
        count = decode[i+1];
        for(j=0;j<count;j++)
        {
            ret_data[ret_len++] = decode[i];
        }
    }
    return ret_data;
}
时间: 2024-08-05 23:05:49

游程编码问题的相关文章

UVA 11235 (游程编码+ST算法)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23846 题目大意:给定一个升序序列,有q次询问,每次询问(L,R)出现最多的值的次数. 解题思路: 非常麻烦的题目.尽管一眼就能看出来是个RMQ. 关键在于如何转化为RMQ. 首先对序列进行游程编码,压缩成pos段. 编码的同时用num[i]记录当前点在段中编号,LB[i]记录在当前段的左边界,更新code[pos](当前段的容量) 编码之后O(n)扫一遍,用nu

游程编码压缩及解压缩

学过GIS的人应该都知道,在这个大数据时代,我们的地图数据量有时候往往是非常庞大的,存储它将会耗费非常多的内存,读取速度也相对减慢了.所以GISer们常常会对栅格的地图数据进行压缩编码存储,等到要用到这个数据的时候再解压缩显示就好了,这样不仅可以节约大量的存储空间,而且节省了系统读取和反应的时间.栅格数据压缩编码的方法有很多种,包括链式编码.行程编码.块式编码和四叉树编码.今天我们就来讲一下行程编码(也叫游程编码). 所谓游程编码,就是只在各行(或列)数据的代码发生变化时依次记录该代码以及相同代

锯齿形扫描和游程编码

变换系数量化后,在低频和直流区域有少量较大的值,高频区域有少量不大的值,系数大部分为零,为了更有效的编码,通常根据该统计特性采用熵编码来进一步压缩码率. 熵编码之前,要进行锯齿形扫描和游程编码. 锯齿形扫描 以4x4块为例,量化后系数按下图所示的顺序进行锯齿形扫描,并排列成一个串行数据序列. 游程编码 在变换域,量化后系数用三个量表示:0的个数(称为游程).系数值和最后的位置(若非0系数已处于最后的位置或其后均为0,则为1,否则为0). e.g. 经过锯齿形扫描后,得到输入序列: 15,0,0,

基于统计的压缩算法:游程编码

1.游程编码概念 游程编码又称"运行长度编码"或"行程编码",是一种统计编码,该编码属于无损压缩编码. 2.基本原理 用一个符号值和串长代替具有相同值的连续符号,使符号长度少于原始数据的长度. 如:   原始文本:dfffffeeeeettttrrrrttttt 游程编码后文本:d1f5e5t4r4t5  3.代码示例 1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5

uva 11235 Frequent values(游程编码+区间最小值查询)

游程编码的基本原理是:用一个符号值或串长代替具有相同值的连续符号(连续符号构成了一段连续的"行程".游程编码因此而得名),使符号长度少于原始数据的长度.只在各行或者各列数据的代码发生变化时,一次记录该代码及相同代码重复的个数,从而实现数据的压缩. 游程编码(Run Length Encoding , RLE) 例如:5555557777733322221111111 游程编码为:(5,6)(7,5)(3,3)(2,4)(1,7) 解题思路很好: 用value[i] count[i] 分

二值信息隐藏(分块和游程编码实现)

使用分块进行信息隐藏,因为在对角线上的分块上进行的隐藏,所以 可以明显看到在对角线上有一条线, 200*200的二值图像 512*512的二值图像 (二)使用游程编码,书上的代码逻辑上有错误,还有一些函数错误,根本不能运行出结果 自己修改了得到以下结果 200*200的隐藏160位,可以看到微小的变化 512*512的隐藏160位,基本看不到变化 二值对角线分块隐藏代码 clc; clear; msgfid = fopen('hidden.txt','r'); % 隐藏信息 [msg, coun

算法科普:有趣的游程编码

在这个大数据时代,我们保存的数据量有时候往往是非常庞大的,存储它将会耗费非常多的内存,读取速度也相对减慢了. 因此常常需要对数据进行压缩编码存储,等到要用到这个数据的时候再解压缩就行,这样不仅可以节约大量的存储空间,而且节省了系统读取和反应的时间. 栅格数据压缩编码的方法有很多种,包括链式编码.行程编码.块式编码和四叉树编码.今天我们就来讲一下行程编码(也叫游程编码). 首先从一个简单的例子开始:编码一个在 5 * 5 方块上使用三种颜色绘制的图像. 图 1 根据方块不同的颜色匹配不同的字母.这

&lt;swustoj&gt;?id=190 游程编码

链接http://acm.swust.edu.cn/problem/190/ #include <stdio.h> #include <string.h> int main() { char str[105]; int i; while(scanf("%s",str)!=EOF) { int k=0; char a[105]={'\0'}; int b[105]={0}; for(i=0;i<strlen(str);i++) { if(i==0||str[

POJ3368Frequent values[RMQ 游程编码]

Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17581   Accepted: 6346 Description You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In addition to that, you are given several queries cons