kodowanie Levenshteina

Kodowanie Levensteina lub kodowanie Levenshteina to uniwersalny kod kodujący nieujemne liczby całkowite opracowany przez Vladimira Levenshteina .

Kodowanie

Kod zera to „0”; zakodować liczbę dodatnią :

  1. Zainicjuj zmienną licznika kroków C na 1.
  2. Zapisz binarną reprezentację liczby bez początkowej „1” na początku kodu.
  3. Niech M będzie liczbą bitów zapisanych w kroku 2.
  4. Jeśli M nie wynosi 0, zwiększ C , powtórz od kroku 2 z M jako nową liczbą.
  5. Napisz bity C „1” i „0” na początku kodu.

Kod zaczyna się:

Numer Kodowanie Domniemane prawdopodobieństwo
0 0 1/2
1 10 1/4
2 110 0 1/16
3 110 1 1/16
4 1110 0 00 1/128
5 1110 0 01 1/128
6 1110 0 10 1/128
7 1110 0 11 1/128
8 1110 1 000 1/256
9 1110 1 001 1/256
10 1110 1 010 1/256
11 1110 1 011 1/256
12 1110 1 100 1/256
13 1110 1 101 1/256
14 1110 1 110 1/256
15 1110 1 111 1/256
16 11110 0 00 0000 1/4096
17 11110 0 00 0001 1/4096

Aby zdekodować liczbę całkowitą zakodowaną metodą Levensteina:

  1. Policz liczbę bitów „1”, aż napotkasz „0”.
  2. Jeśli liczba wynosi zero, wartość wynosi zero, w przeciwnym razie
  3. Zacznij od zmiennej N , ustaw ją na wartość 1 i powtórz count minus 1 razy:
  4. Odczytaj N bitów, dodaj „1”, przypisz wynikową wartość do N

Kod Levensteina dodatniej liczby całkowitej jest zawsze o jeden bit dłuższy niż kod omega Eliasa tej liczby całkowitej. Istnieje jednak kod Levensteina oznaczający zero, podczas gdy kodowanie Elias omega wymagałoby przesunięcia liczb, tak aby zero było reprezentowane przez kod oznaczający jedynkę.

Przykładowy kod

Kodowanie

    

     
     
     
    
           
           0
             void  levenshteinEncode  (  char  *  source  ,  char  *  dest  )  {  IntReader  intreader  (  source  );  BitWriter  BitWriter  (  miejsce docelowe  );  while  (  intreader  .  hasLeft  ())  {  int  num  =  intreader  .  pobierzInt  ();  if  (  liczba  ==  )  zapis bitowy  . 0
        
        
               0
             
             
                   0
                          
                    
                  0    bit wyjściowy  (  );  else  {  int  c  =  ;  Bity  BitStack  ;  wykonaj  {  int  m  =  ;  for  (  int  temp  =  liczba  ;  temp  >  1  ;  temp  >>=  1  )  // oblicz piętro(log2(liczba))  ++  m  ;  for  (  int  i  =  ;  ja  <  m  ;  
                        
                  
                
                0
              0    
                
             ++  i  )  bity  .  pushBit  ((  liczba  >>  i  )  &  1  );  liczba  =  m  ;  ++  do  ;  }  while  (  liczba  >  );  for  (  int  i  =  ;  i  <  c  ;  ++  i  )  bitwriter  .  bit wyjściowy  (  1  );  bitwriter  . 0
               0
                
        
    
 bit wyjściowy  (  );  while  (  bity  .  długość  ( )  >  )  bitwriter  .  outputBit  (  bity  .  popBit  ());  }  }  } 

Rozszyfrowanie

    

     
     
     
    
           0
              
             void  levenshteinDecode  (  char  *  source  ,  char  *  dest  )  {  BitReader  bitreader  (  source  );  IntWriter  intwriter  (  dest  );  while  (  czytnik bitów  .  hasLeft  ())  {  int  n  =  ;  while  (  bitreader  .  inputBit  ())  // potencjalnie niebezpieczne ze zniekształconymi plikami.  ++ 
         
           0
              0
        
        
              
                0    
            
                   
                    0     n  ;  int  liczba  ;  jeśli  (  n  ==  )  liczba  =  ;  else  {  liczba  =  1  ;  for  (  int  ja  =  ;  ja  <  n  -1  ;  ++  ja  )  {  int  wartość  =  1  ;  for  (  int  j  =  ;  j  <  liczba  ;  ++  j 
                          
                  
            
        
                   
    
    
    
 )  wartość  =  (  wartość  <<  1  )  |  czytnik bitów  .  bit wejściowy  ();  liczba  =  wartość  ;  }  }  autor  .  putInt  (  liczba  );  // wypisz wartość  }  bitreader  .  zamknij  ();  autor  .  zamknij  ();  } 

Zobacz też