2010-02-12 2 views
0

문자열의 중복 문자 제거시 최근 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.

+0

주어진 답변으로 충분할 때 내 질문을 어떻게 닫을 수 있습니까? – t0mm13b

+0

bzip2 알고리즘에서와 같이 예비 BWT + MTF는 더 많은 데이터 세트에서 RLE를 지원할 수 있습니다. – ephemient

답변

4

RLE는 골프 골프 문제를 해결하지 않습니다.

골프 골프 문제는 출현 위치에 관계없이 입력 내용에 두 번 이상 나오는 모든 문자를 제거해야합니다. 그러나 RLE, "run length encoding"은 동일한 문자의 반복 된 시퀀스 인 "runs"을 인코딩합니다. 동일한 문자를 여러 번 실행하면 문자열에 나타날 수 있으며 RLE는 의도적으로 이러한 문자를 개별적으로 인코딩합니다.

RLE는 시퀀스를 단 하나의 요소로 대체하고 반복되는 횟수만큼 반복하여 반복적 인 데이터 요소의 시퀀스를보다 압축하여 인코딩하기위한 것입니다. 이 목적을 위해 그것은 완벽하게 적절합니다. 모든 "결함"은 알고리즘에있는 것이 아니라 적합성이 떨어지는 용도로 사용하기로 결정한 것입니다.

+0

@ oonhadow : 고마워! 나는 어제이 머리를 부딪 히고 나서 깨달았다. 내 생각이 그 목적에 맞지 않았다 !!! :) 당신은 받아 들여진 대답을 얻습니다. 그것은 OTT가 아니라 복잡한 것을 생각하지 않도록주의를 보여줍니다 ... – t0mm13b

2

RLE는 일반적으로 동일한 문자가 길게 실행되므로 일반적으로 8 비트 비트 맵에 사용됩니다. Windows는 여전히 비슷한 방식으로 사용 된 RLE 비디오 코덱을 지원합니다. 요즘 LZW + Huffman 인코딩은 RLE를 "단순한"압축 알고리즘으로 대체했습니다.

RLE는 수년 동안 사용되어 왔기 때문에 "결함이 있음"이라고 말하기는 꽤 어렵지만 확실히 효율적이지는 않습니다.

대부분의 RLE 형식은 "이스케이프 문자"를 가지므로 출력과 관련하여 혼동이 없어야합니다. 예를 들어

, 우리는 이스케이프 문자로 "E"를 사용하는 경우 ...

이것은 litteral "E"를 생성 할 것입니다 :

ee 

이것은 문자 될 것 "a"를 두 번 반복을 :

ea2 
+0

@ 존 : 고마워,하지만 여전히 그것에 대한 내 질문에 답을하지 않는다. – t0mm13b

+1

@ tommieb75 : 결함이 있다는 것은 무엇을 의미합니까? 그것은 그것이하기로되어있는 일을합니다. 동일한 값의 연속 블록을 가진 데이터를 압축하는 데 유용합니다. 큰 색상 영역이있는 저 색상 이미지. 그러나이 골프 문제를 해결하기에 충분한 정보 (중복되지는 않지만 인접하지 않은 문자)를 생성하지는 않습니다. – Anssi

1

왜 결함이 있다고 생각합니까? RLE는 반복되는 문자 압축에 사용됩니다. 다른 것을하기위한 것이 아니며 실행 길이> 1이 아닌 데이터를 압축하는 데 도움이되지 않습니다.

이 문제의 맥락에서 나는 RLE가 옳은 대답이 아니며, 결함이 없다고 말합니다. 이 경우에는 도움이되지 않습니다.

+0

@ 스티브 : 감사합니다! 아래 내 코멘트를 참조하십시오! :) – t0mm13b

관련 문제