2016-12-11 9 views
0

텍스트 파일이 있고 LZW 알고리즘을 올바르게 구현했다고 생각되지만 압축 된 파일이 원본보다 커졌습니다.원본보다 큰 LZW 압축 생성 파일

텍스트의 바이트가 아니라 문자열 대신 LZW를 실행하고 있습니다.

사전 [string:int]을 만들고 실행합니다. 문자열 대신 바이트를 사용해야하는지 궁금합니다.

또한 전체 파일에 대해 하나의 사전 만 작성하는 대신 파일의 줄 단위로 실행됩니다.

내 LZW

map<string, int> D;      //dictionary 

int init(){        //init dictionary with all single chars 
    D.clear(); rD.clear(); 
    f(i,,256){ 
     D[string(1, char(i))] = i + 1; 
    } 
    return 257; 
} 

void encode(char* file){     //LZW encoding method 
    ifstream in(file); 
    if (!in.is_open()) {cout<<"Could not open file"<<endl; return;} 
    else { 
     ofstream out("compressed.txt"); 
     for(string text; getline(in, text);){ 

      int value = init(); 
      vector<int> idx; 
      string p = "", c = "", pc = ""; 

      for(int i = 0; i < text.size(); i++){ 
       c = text[i]; 
       let s = p + c; 
       if(D.find(s) != D.end()){ 
        p = p + c; 


      } 
      else{ 
       idx.push_back(D[p]); 
       D[s] = value++; 
       p = c; 
      } 
     } 
     idx.push_back(D[p]); 
     int len = idx.size(); 
     f(i,,len) {out<<idx[i]; if(i == len-1) out<<" 0"<<endl; else out<<" ";} 
    } 
    in.close(); 
    out.close(); 
    cout<<"File compressed successfully"<<endl; 

} 

}

그냥 파일의 주소를 수신하고 그것에 "compressed.txt"파일을 압축합니다.

+0

우선 텍스트 파일에서 출력하고 있지만 바이너리가 무엇인지 더 잘 설명 할 수 있습니까? –

+0

이 필요합니까? 나는 어떻게 이것을 하는가? 그리고 그것은 나를 어떻게 도울 것인가? – Daniel

+0

바이너리 출력을 위해 출력 파일을 열어야합니다 :'ofstream out ("compressed.txt", std :: ios :: binary); '. 당신이 글을 쓰려고한다고 상상해보십시오. 1234는 파일에, 텍스트 모드에서는 4 바이트가 걸리지 만 2 진수에서는 단지 2 –

답변

0

LZW의 핵심은 중복 된 바이트를 기호로 변환 한 다음 심볼을 비트 스트림에 씁니다. 더 많은 중복 된 바이트 일수록보다 높은 압축률을 얻을 수 있습니다. 그리고 압축 된 비트는 많은 공간을 절약 할 것입니다.

심볼을 int 형식으로 쓰면 ofstream에 4 바이트 이상 사용할 가능성이 있습니다. 그러나 압축 된 비트는 설정하는 방법에 따라 9 비트에서 16 비트까지 차지합니다. 이것이 출력이 예상보다 큰 주된 이유라고 생각합니다.

행운을 빈다.

+0

여분의 비트 지출을 피하려면 어떻게해야합니까? – Daniel

+0

기호를 포장해야합니다. 예를 들어 첫 번째 256 심볼은 9 비트를 사용하고, 다음 512 심볼은 10 비트를 사용합니다. 나는 그것이 어떻게 체계화 되었는가를 정확하게 기억하지 못한다. 그러나 이해하고 구현하는 것은 그리 어렵지 않다. –