La codificación Levenshtein es un código universal que codifica los números enteros no negativos desarrollado por Vladimir Levenshtein . [1] [2]
El código de cero es "0"; para codificar un número positivo :
El código comienza:
Para decodificar un entero codificado en Levenshtein:
El código Levenshtein de un número entero positivo es siempre un bit más largo que el código omega Elias de ese número entero. Sin embargo, existe un código de Levenshtein para cero, mientras que la codificación omega de Elias requeriría que los números se desplazaran para que un cero esté representado por el código de uno.
void levenshteinEncode ( char * fuente , char * destino ) { IntReader intreader ( fuente ); BitWriter bitwriter ( destino ); mientras ( intreader . hasLeft ()) { int num = intreader . obtenerInt (); si ( num == 0 ) bitwriter . bit de salida ( 0 ); de lo contrario { int c = 0 ; Bits de pila de bits ; hacer { int m = 0 ; for ( int temp = num ; temp > 1 ; temp >>= 1 ) // calcular piso(log2(num)) ++ m ; para ( int i = 0 ; i < m ; ++ i ) bits . pushBit (( número >> i ) & 1 ); número = m ; ++ c ; } mientras ( número > 0 ); para ( int i = 0 ; i < c ; ++ i ) bitwriter . bit de salida ( 1 ); escritor de bits . bit de salida ( 0 ); mientras ( bits . longitud () > 0 ) bitwriter . salidaBit ( bits . popBit ()); } } }
void levenshteinDecode ( char * fuente , char * destino ) { BitReader bitreader ( fuente ); IntWriter intwriter ( destino ); mientras ( bitreader . hasLeft ()) { int n = 0 ; while ( bitreader . inputBit ()) // potencialmente peligroso con archivos con formato incorrecto. ++ norte ; número int ; si ( n == 0 ) número = 0 ; más { número = 1 ; for ( int i = 0 ; i < n -1 ; ++ i ) { int val = 1 ; para ( int j = 0 ; j < núm ; ++ j ) val = ( val << 1 ) | lector de bits . bit de entrada (); número = valor ; } } escritor interno . putInt ( núm ); // escribe el valor } bitreader . cerca (); escritor interno . cerca (); }