【发布时间】:2011-01-16 03:37:52
【问题描述】:
我正在查看最近的Code Golf 删除字符串中的重复字符。我仔细考虑了一下,认为 RLE 算法会解决它,事实上,我确实相信这会解决删除重复问题,我在这里用 C 编写了一个实现,看看我能走多远
char *rle(const char *src){ 字符 *p=(字符 *)src; 字符 *q=(字符 *)src+1; char *rle_enc=NULL, *tmp_rle, buf[10]; 诠释运行=1; 而 (*p){ 而(*q){ 如果 (*p==*q++) 运行++,p++; } sprintf(buf,"%d%c",运行,*(p-1)); p++; 如果(!rle_enc){ 如果 ((rle_enc=malloc(strlen(buf)+1))!=NULL){ strcpy(rle_enc,buf); } }别的{ 如果 ((tmp_rle=realloc(rle_enc,(strlen(rle_enc)+strlen(buf)+1)))!=NULL){ rle_enc=tmp_rle; strcat(rle_enc,buf); } } q=(p+1); 运行=1; } 返回 rle_enc; }果然,这里是主要的:
int main(int argc, char **argv){ char *test1 = "HHHHHHeeeeeellllloooooooo"; 字符 *test2 = "nbHHkRvrXbvkn"; 字符 *p = rle(test1); printf("s = %s\n", test1); printf("p = %s\n", p); 如果(p)免费(p); 返回0; }根据 meta 上的Code Golf,它应该是可重用的并解决了一系列问题,但在最短的字符集中,我认为我只需将变量更改为 1 个字母并压缩代码即可它很小..但有些地方不太对劲,因为这让我想到了 RLE 算法本身,这是Wikipedia 上的一个页面,关于它要说的内容和 Java 中的实现。
代码似乎在做它应该做的事情,所以我想,现在,只需检查来自rle 的编码字符串结果,寻找那些后面有一个字母的 1..
不过我确实注意到了 RLE 算法的局限性,它只适用于那些具有一组相邻的重复字符的算法。但是它没有通过 Code Golf 的测试用例,看起来很简单,这让我想到了这个问题:
RLE 算法有缺陷吗?现在会用在什么地方?我认为由于 RLE 周围流动的大量数据和信息不再适合目的,因此收集灰尘......
编辑:感谢 Moonshadow、John 和 Steve 发布他们的答案。
有一个基本的教训我仍然没有学到 - 永远不要去 OTT 并在涉及到这种事情时想得复杂,这对我来说是一个谬误,并显示出大的想法会阻碍你而且我会被它吸得太深,不看正确的角度就被冲昏了头脑!!!!!!!再次感谢! :)
【问题讨论】:
-
由于给出的答案已经足够,我该如何结束自己的问题?
-
初步的 BWT + MTF,如 bzip2 算法,可能有助于 RLE 处理更多数据集。
标签: c