문자열의 중복 문자 제거시 최근 Code Golf을보고있었습니다. 나는 내가 그것을RLE 알고리즘에 결함이 있습니까?
char *rle(const char *src){ char *p=(char *)src; char *q=(char *)src+1; char *rle_enc=NULL, *tmp_rle, buf[10]; int run=1; while (*p){ while(*q){ if (*p==*q++) run++,p++; } sprintf(buf,"%d%c",run,*(p-1)); p++; if (!rle_enc){ if ((rle_enc=malloc(strlen(buf)+1))!=NULL){ strcpy(rle_enc,buf); } }else{ if ((tmp_rle=realloc(rle_enc,(strlen(rle_enc)+strlen(buf)+1)))!=NULL){ rle_enc=tmp_rle; strcat(rle_enc,buf); } } q=(p+1); run=1; } return rle_enc; }
와 함께 갈 수 얼마나 멀리보고, C 여기 구현을 쓴, 그것을 넘어서 심사숙고하고 RLE 알고리즘은, 사실, 난 그 중복을 제거 해결 할 생각 않았다 해결할 것이라고 생각 아니나 다를까, 여기에 대한 주의 :
int main(int argc, char **argv){ char *test1 = "HHHHHHeeeeeelllllloooooooo"; char *test2 = "nbHHkRvrXbvkn"; char *p = rle(test1); printf("s = %s\n", test1); printf("p = %s\n", p); if (p) free(p); return 0; }
메타에 Code Golf에 따르면, 재사용하고 문제의 집합을 해결하지만 문자의 짧은 세트에서해야 공평 난 그냥 변화 거라 생각 변수를 1 글자로하고 코드를 압축하여 작게 만드십시오. 그러나 RLE 알고리즘에 대해 생각하게 만들면서 뭔가 잘못되었습니다. 그 자체가 여기 Wikipedia에 관한 페이지와 Java에서의 구현에 관한 것입니다.
.. 코드는 무엇을해야 일을 할 나타나지 않기 때문에, 지금,이 문자 뒤에 1이 그 사람을 찾고 rle
에서 인코딩 된 문자열 결과를 겪고 단지 문제, 생각
그러나 RLE 알고리즘의 한계에 주목 했으므로 반복적 인 문자 집합이 서로 인접 해있는 경우에만 적합합니다. 그러나 코드 골프 (Code Golf)의 테스트 케이스를 무시하고 간단하게 보았습니다. 다음 질문에 이르게되었습니다.
RLE 알고리즘에 결함이 있습니까? 요즘 어디에서 사용 되나요? 먼지를 모으는 것은 데이터의 양과 RLE 주위를 흐르는 정보로 인해 더 이상 목적에 부합하지 않는다고 생각합니다. ...
편집 : 해답을 게시 한 Moonshadow, John 및 Steve에게 감사드립니다.
내가 배우지 못한 근본적인 교훈이 있습니다. 절대로 OTT에 가지 말고 복잡한 것을 생각해보십시오. 그것은 내 부분의 오류이며, 큰 사고가 방법과 나는 그것에 깊이 빠져 들어갈 수 있고, 직각을 보지 않고 도취 될 수있다 !!!!! 다시 한 번 감사드립니다! :)
감사합니다, Tom.
주어진 답변으로 충분할 때 내 질문을 어떻게 닫을 수 있습니까? – t0mm13b
bzip2 알고리즘에서와 같이 예비 BWT + MTF는 더 많은 데이터 세트에서 RLE를 지원할 수 있습니다. – ephemient