Loading article…
レーベンシュタイン符号は、ウラジミール・レーベンシュタインによって開発された非負整数を符号化する汎用符号である。[1] [2]
エンコーディング
- 歩数変数Cを1に初期化します。
- 先頭の「1」を除いた数値の2 進表現をコードの先頭に記述します。
- ステップ 2 で書き込まれたビット数をMとします。
- Mが 0 でない場合は、 C を増分し、 M を新しい数値として手順 2 から繰り返します。
- コードの先頭にC の「1」ビットと「0」を書き込みます。
コードは次のように始まります:
レーベンシュタイン符号化された整数をデコードするには:
- 「0」に遭遇するまで「1」ビットの数を数えます。
- カウントがゼロの場合、値はゼロ、それ以外の場合は
- 数えたばかりの「1」ビットと最初に遭遇した「0」ビットを破棄する
- 変数Nから始めて、値を 1 に設定し、count から 1 を引いた回数を繰り返します。
- Nビットを読み取り(エンコードされた整数から削除)、先頭に「1」を追加し、結果の値をNに割り当てます。
正の整数のレーベンシュタイン コードは、その整数のエリアス オメガ コードよりも常に 1 ビット長くなります。ただし、0 のレーベンシュタイン コードがあるのに対し、エリアス オメガ コーディングでは、0 が 1 のコードによって表されるように数値をシフトする必要があります。
サンプルコード
エンコーディング
void levenshteinEncode ( char * source , char * dest ) { IntReader intreader ( source ); BitWriter bitwriter ( dest ); while ( intreader . hasLeft ()) { int num = intreader . getInt (); if ( num == 0 ) bitwriter . outputBit ( 0 ); else { int c = 0 ; BitStack bits ; do { int m = 0 ; for ( int temp = num ; temp > 1 ; temp >>= 1 ) // floor(log2(num)) ++ mを計算します。for ( int i = 0 ; i < m ; ++ i ) bits . pushBit (( num >> i ) & 1 ); num = m ; ++ c ; } while ( num > 0 ); for ( int i = 0 ; i < c ; ++ i ) bitwriter . outputBit ( 1 ); bitwriter . outputBit ( 0 ); while ( bits . length () > 0 ) bitwriter . outputBit ( bits . popBit ()); } } }
デコード
void levenshteinDecode ( char * source , char * dest ) { BitReader bitreader ( source ); IntWriter intwriter ( dest ); while ( bitreader . hasLeft ()) { int n = 0 ; while ( bitreader . inputBit ()) // 不正なファイルの場合、潜在的に危険です。++ n ; int num ; if ( n == 0 ) num = 0 ; else { num = 1 ; for ( int i = 0 ; i < n -1 ; ++ i ) { int val = 1 ; for ( int j = 0 ; j < num ; ++ j ) val = ( val << 1 ) | bitreader . inputBit (); num = val ; } } intwriter . putInt ( num ); // 値を書き出します} bitreader . close (); intwriter .close ( ); }
参照
参考文献
- ^ 「1968年のVI Levenshteinの論文(ロシア語)」(PDF)。
- ^ David Salomon (2007). データ圧縮のための可変長コード。Springer。p. 80。ISBN 978-1-84628-958-3。
