RLE 算法有缺陷吗?

t0m*_*13b 0 c

我正在查看最近关于删除字符串中重复字符的Code Golf。我仔细考虑了一下,认为 RLE 算法可以解决它,事实上,我确实相信这可以解决删除重复项的问题,我在这里用 C 编写了一个实现,看看我能用它走多远

char *rle(const char *src){
    char *p=(char *)src;
    char *q=(char *)src+1;
    char *rle_enc=NULL, *tmp_rle, buf[10];
    int运行=1;
    而 (*p){
        而(*q){
            if (*p==*q++) 运行++,p++;
        }
        sprintf(buf,"%d%c",run,*(p-1));
        p++;
        如果(!rle_enc){
            if ((rle_enc=malloc(strlen(buf)+1))!=NULL){
                strcpy(rle_enc,buf);
            }
        }别的{
            if ((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 = "HHHHHHeeeeeelllllloooooooo";
    char *test2 = "nbHHkRvrXbvkn";
    字符 *p = rle(test1);
    printf("s = %s\n", test1);
    printf("p = %s\n", p);
    如果(p)免费(p);
    返回0;
}

根据元数据上的代码高尔夫,它应该是可重用的并解决了一系列问题,但是在最短的字符集中,足够公平,我想我只是将变量更改为 1 个字母并压缩代码以使其变小。但它有些不对劲,因为这让我想到了 RLE 算法本身,这是维基百科上关于它必须说的内容和 Java 实现的页面。

代码似乎确实在做它应该做的事情,所以我想,现在,这只是通过rle查找那些带有 1 后跟字母的字符串来查看编码字符串结果的问题。

然而,我确实注意到 RLE 算法的局限性,它仅适用于那些具有一组彼此相邻的重复字符的算法。但是它在 Code Golf 的测试用例中失败了,它看起来很简单,这让我想到了这个问题:

RLE 算法有缺陷吗?现在它会用在什么地方?收集灰尘我认为由于数据和信息量在 RLE 周围流动不再适合目的......

编辑:感谢 Moonshadow、John 和 Steve 发布他们的答案。

有一个基本的教训我仍然没有学到 - 永远不要去 OTT 并在谈到这种事情时考虑复杂,这对我来说是一个谬论,并表明思考有多大的障碍,我可以被吸得太深,没有看正确的角度就得意忘形了!!!!!再次感谢!:)

moo*_*dow 5

RLE 不会为您解决代码高尔夫问题。

代码高尔夫问题要求您去除在输入中出现多次的所有字符,而不管出现在哪里。然而,RLE,“运行长度编码”,编码“运行”——相同字符的重复序列;同一个字符的多次运行可以出现在一个字符串中,并且 RLE 将按照设计分别对它们进行编码。

RLE 旨在更紧凑地编码重复数据元素的序列,方法是将序列替换为仅一个元素,后跟重复的次数。为此目的,它是完全足够的。任何“缺陷”都不在算法中,而在于将其用于不适合的目的的决定。