mtf算法(关于该算法:https://www2.cs.duke.edu/csed/algoprobs/beta/bw1.html):

#include <stdio.h>
#include <string.h>
#include <stdlib.h> void mtf_encode(const char *s, unsigned len, int *code)
{
int pos = 0, num, trace = 0;
unsigned i, j, k;
int is_hav[26], stack[26]; memset(is_hav, 0, 26); while (*s)
{
if (!is_hav[*s - 'a'])
{
stack[pos] = *s - 'a' + 1;
is_hav[*s - 'a'] = 1;
++pos;
code[trace++] = pos;
}
else
{
j = 0;
while (stack[j] != *s - 'a' + 1) j++;
code[trace++] = j + 1, num = stack[j];
while (j > 0) stack[j] = stack[j - 1], j--;
stack[j] = num;
}
s++;
}
} void print_mtf_encode(int*code, int len)
{
unsigned i;
printf("[");
for (i = 0; i < len; i++)
{
printf("%d", code[i]);
if (i != len - 1)
printf(", ");
}
printf("]\n");
} int main()
{
char s[] = "abcabcaaaaaaaab";
int len = strlen(s);
int *code = (int *)malloc(sizeof(int) * len);
mtf_encode(s, len, code);
print_mtf_encode(code, len);
free(code);
return 0;
}

  上面算法不是错的,根据题意和不同的思考角度可以编写不同的mtf算法,按字典序排序后的mtf算法(只统计出现的字符):

void mtf_encode(const char *s, unsigned len, int *code)
{
int num, trace = 0;
unsigned i, pos = 0;
int is_hav[26], stack[26]; memset(is_hav, 0, 26); for (i = 0; i < len; i++)
if (!is_hav[s[i] - 'a'])
is_hav[s[i] - 'a'] = s[i] - 'a' + 1; for (i = 0; i < 26; i++)
if (is_hav[i] != 0)
stack[pos++] = is_hav[i]; while (*s)
{
pos = 0;
while (stack[pos] != *s++ - 'a' + 1) pos++;
code[trace++] = pos + 1, num = stack[j];
while (pos > 0) stack[pos] = stack[pos - 1], pos--;
stack[pos] = num;
}
}

  rle算法(了解该算法:https://en.wikipedia.org/wiki/Run-length_encoding):

const char*digits = "0123456789";

void comp_bit(char *rle, int *i, int num)
{
if (num > 9)
comp_bit(rle, i, num / 10);
rle[(*i)++] = digits[num%10];
} void rle_encode(const char *s, char *rle)
{
unsigned i = 0, j = 1;
rle[i++] = *s++;
while (*s)
{
if (rle[i - 1] != *s)
{
comp_bit(rle, &i, j);
rle[i++] = *s, j = 1;
}
else j++;
s++;
}
comp_bit(rle, &i, j);
}

  

  

Move-to-front(MTF) and Run-lenght encoding(RLE) algorithms的更多相关文章

  1. poj-1782 Run Length Encoding

    http://poj.org/problem?id=1782 Run Length Encoding Time Limit: 1000MS   Memory Limit: 30000K Total S ...

  2. Gym 100342F Move to Front (树状数组动态维护和查询)

    用树状数组动态和查询修改排名. 树状数组可以很方便地查询前缀和,那么可以利用这一特点,记录一个点在树状数组里最后一次出现的位置, 查询出这个位置,就可以知道这个点的排名了.更改这个点的排名的时候只要把 ...

  3. SDUT 2352 Run Length Encoding

    点我看题目 题意 :将给定的字符串编码,编码的规则根据两条,1.如果字符串里有连续相等的字符,就变为两个字符,一个是这些连续相同的字符的个数,另一个是这个字符,但是如果数量超过了9个,那就输出9再输出 ...

  4. UVW源码漫谈(番外篇)—— Emitter

    这两天天气凉了,苏州这边连续好几天都是淅淅沥沥的下着小雨,今天天气还稍微好点.前两天早上起来突然就感冒了,当天就用了一卷纸,好在年轻扛得住,第二天就跟没事人似的.在这里提醒大家一下,天气凉了,睡凉席的 ...

  5. hive_学习_01_hive环境搭建(单机)

    一.前言 本文承接上一篇:hbase_学习_01_HBase环境搭建(单机),主要是搭建 hive 的单机环境 二.环境准备 1.说明 hive 的下载来源有: 官方版本:http://archive ...

  6. UVA 1351 十三 String Compression

    String Compression Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit ...

  7. COCO 数据集的使用

    Windows 10 编译 Pycocotools 踩坑记 COCO数据库简介 微软发布的COCO数据库, 除了图片以外还提供物体检测, 分割(segmentation)和对图像的语义文本描述信息. ...

  8. 北大poj- 1009

    Edge Detection Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22835   Accepted: 5398 D ...

  9. 自制 COCO api 直接读取类 COCO 的标注数据的压缩文件

    第6章 COCO API 的使用 COCO 数据库是由微软发布的一个大型图像数据集,该数据集专为对象检测.分割.人体关键点检测.语义分割和字幕生成而设计.如果你要了解 COCO 数据库的一些细节,你可 ...

随机推荐

  1. Spring核心知识

    目录 Spring 概述 依赖注入 Spring beans Spring注解 Spring数据访问 Spring面向切面编程(AOP) Spring MVC Spring 概述 1. 什么是spri ...

  2. open函数 文件设置缓冲

    # 注释 将文件写入硬件设备时,使用系统调用,这类I/O操作一般时间很长 # 为了减少I/O次数操作,文件通常使用缓冲区(有足够的数据才进行系统调用) # 文件缓冲行为分为: # 全缓冲: open函 ...

  3. JavaScript HTML DOM 关系层级(父子兄弟姐妹关系)

    通过 HTML DOM,您能够使用节点关系来导航节点树. DOM 节点 根据 W3C HTML DOM 标准,HTML 文档中的所有事物都是节点: 整个文档是文档节点 每个 HTML 元素是元素节点 ...

  4. 关于jquery绑定事件执行两次

    经常会出现jquery绑定事件执行两次的情况,如: $("a[tag=slide]").click(function () { alert(1); $(this).parent() ...

  5. [thinkphp] 启用__PUBLIC__

    我真是受够了,,, 为了解决__PUBLIC__不能用的问题 我折腾了好几天了,然后终于被我找到了原因 解决过程 首先必须贴出来帮助我的人 https://my.oschina.net/u/12630 ...

  6. IntelliJ IDEA如何导入jar包

    转自:https://jingyan.baidu.com/article/0f5fb0993e9e1f6d8334ead2.html 通过这种方式导入jar包,idea就能百分百识别到,如果是那种直接 ...

  7. 牛客腾讯2020校园招聘-后台&综合-第一次笔试

    第一题 Q: 小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为m|S,例如字符串 ...

  8. springboot08(springmvc自动配置原理)

    MVC WebMvcAutoConfiguration.java @ConditionalOnMissingBean(name = "viewResolver", value = ...

  9. 7-8 Left-pad

    思路 注意读入和输出格式 如果用fgets读入的话会带上回车,输出的时候一定不要输出了双回车 并且此时的length也会比原始长度多了一,要注意长度比较,这里容易出错 代码 #include < ...

  10. AcWing 841. 字符串哈希

    //快速判断两次字符串是不是相等 #include<bits/stdc++.h> using namespace std ; typedef unsigned long long ULL; ...