Move-to-front(MTF) and Run-lenght encoding(RLE) algorithms
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的更多相关文章
- poj-1782 Run Length Encoding
http://poj.org/problem?id=1782 Run Length Encoding Time Limit: 1000MS Memory Limit: 30000K Total S ...
- Gym 100342F Move to Front (树状数组动态维护和查询)
用树状数组动态和查询修改排名. 树状数组可以很方便地查询前缀和,那么可以利用这一特点,记录一个点在树状数组里最后一次出现的位置, 查询出这个位置,就可以知道这个点的排名了.更改这个点的排名的时候只要把 ...
- SDUT 2352 Run Length Encoding
点我看题目 题意 :将给定的字符串编码,编码的规则根据两条,1.如果字符串里有连续相等的字符,就变为两个字符,一个是这些连续相同的字符的个数,另一个是这个字符,但是如果数量超过了9个,那就输出9再输出 ...
- UVW源码漫谈(番外篇)—— Emitter
这两天天气凉了,苏州这边连续好几天都是淅淅沥沥的下着小雨,今天天气还稍微好点.前两天早上起来突然就感冒了,当天就用了一卷纸,好在年轻扛得住,第二天就跟没事人似的.在这里提醒大家一下,天气凉了,睡凉席的 ...
- hive_学习_01_hive环境搭建(单机)
一.前言 本文承接上一篇:hbase_学习_01_HBase环境搭建(单机),主要是搭建 hive 的单机环境 二.环境准备 1.说明 hive 的下载来源有: 官方版本:http://archive ...
- UVA 1351 十三 String Compression
String Compression Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit ...
- COCO 数据集的使用
Windows 10 编译 Pycocotools 踩坑记 COCO数据库简介 微软发布的COCO数据库, 除了图片以外还提供物体检测, 分割(segmentation)和对图像的语义文本描述信息. ...
- 北大poj- 1009
Edge Detection Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22835 Accepted: 5398 D ...
- 自制 COCO api 直接读取类 COCO 的标注数据的压缩文件
第6章 COCO API 的使用 COCO 数据库是由微软发布的一个大型图像数据集,该数据集专为对象检测.分割.人体关键点检测.语义分割和字幕生成而设计.如果你要了解 COCO 数据库的一些细节,你可 ...
随机推荐
- 【转载】Pig语法进阶
转自:http://www.cnblogs.com/siwei1988/archive/2012/08/06/2624912.html Pig Latin是一种数据流语言,变量的命名规则同java中变 ...
- 松软科技web教程:JavaScript HTML DOM 事件监听器
addEventListener() 方法 实例 添加当用户点击按钮时触发的事件监听器: document.getElementById("myBtn").addEventList ...
- 结合字符串常量池/String.intern()/String Table来谈一下你对java中String的理解
1.字符串常量池 每创建一个字符串常量,JVM会首先检查字符串常量池,如果字符串已经在常量池中存在,那么就返回常量池中的实例引用.如果字符串不在池中,就会实例化一个字符串放到字符串池中.常量池提高了J ...
- 关于#progma comment 中库文件相对路径问题 (转)
最近做一个验证程序的对话框编程,因为里面要要用到静态链接库,所以就稍微的学习了下静态链接库知识,学习的过程中感觉到了自己所了解的东西实在是少的可怜,更加坚定了自己要更加上进的决心,要把以前所丢掉的都给 ...
- 如何查看当前工程,已经安装的nuget包?
本文链接:https://blog.csdn.net/Microsoft_Mao/article/details/101161872如果想知道,当前解决方案(solution)里都安装了什么包,这里可 ...
- Java常量,变量,对象(字面量)在JVM内存中的存储位置
Java常量,变量,对象(字面量)在JVM内存中的存储位置 2019-02-26 18:13:09 HD243608836 阅读数 540 收藏 更多 分类专栏: JAVA jvm 苦苦研究了快 ...
- 前端框架vue.js系列(9):Vue.extend、Vue.component与new Vue
前端框架vue.js系列(9):Vue.extend.Vue.component与new Vue 本文链接:https://blog.csdn.net/zeping891103/article/det ...
- MySQL在cmd命令行查看端口号
在命令行输入: show global variables like 'port'; 转自:https://blog.csdn.net/zhufengy/article/details/8014778 ...
- 转载:EQ
https://blog.csdn.net/qiumingjian/article/details/46326269 https://blog.csdn.net/sszhouplus/article/ ...
- HTML学习(12)列表
HTML包括有序列表ol(ordered list).无序列表ul(unordered list).自定义列表dl(difinition list) 有序列表: <ol start=" ...