1

こんにちは私は、有限の長さの文字列のセットを-1から1までの特定の実数に変換するアルゴリズムを探しています。この場合、すべての文字列は一意の実数表現になります。この質問はプログラミング言語に依存しません。

各文字列には、多数の単語と終了行、および数学的な定義による実数を含めることができます。任意精度のライブラリを使用することもできます。

4

3 に答える 3

8

各文字列を一意の実数にマップし、元の文字列にデコードして戻すこともできると仮定すると、算術符号化を使用します。

基本的に、あなたがしたいのは、-1から1までの実数のセットをアルファベットの文字数に等しい数の部分に分割することですn。単一の文字列をエンコードするには、これらの領域の1つの先頭を選択するだけです。n文字列の2番目の文字をエンコードするには、最初に最初の文字が存在する領域を見つけ、次にその領域をより小さな領域に分割し、2番目の文字が含まれる領域を選択します。次に、このソリューションを繰り返して、任意の長さの文字列を一意の実数に変換できるようにします。

たとえば、アルファベットが文字のみであり、文字列をエンコードするとしaます。最初の文字は領域を与え、2番目の文字はこの領域を細分化して、を生成します。ファイナルで繰り返して、領域を生成します。この領域の任意の数値は、シーケンスにのみデコードできます(元の文字列の長さがわかっている場合、またはデコード時に永久に再帰できる場合)。babaa[-1,0)[-0.5,0)a[-0.5,-0.75)aba

(エンコードおよびデコードプロセスの詳細については、ウィキペディアを参照してください。この問題については、おそらく同じサイズの領域にのみ関心があることに注意してください。)

于 2013-01-02T00:47:13.037 に答える
6

[私のコメントを答えに変える。]

何もする必要はありません。文字列はすでに実数と見なすことができます。各文字は、基数256(8ビット文字の場合)の基数ポイントの後の数字です。

指摘したように、これは複数の末尾\0文字を持つ文字列を区別できません。これが懸念事項である場合は、代わりにこの数値の基数257を検討し、値0への文字コード表を作成しないでください。

アルゴリズムがないため、追加のメモリ要件はありません。入力文字列は出力でもあります!任意精度ライブラリなどに問題はありません。

于 2013-01-02T01:07:00.887 に答える
2

文字列が20ASCIIバイト、つまり160ビットであるとします。倍精度の実数は64ビットしかありません。したがって、可能な文字列ごとに一意の実数を使用することはできません。

一方、64ビットに制限されていない場合は、最初のビットの後に10進数(2進数)を置き、最初のビットを符号とし、文字列のすべてのビットを小数にします。

実際、アルファベットを0〜9の数字に制限すると、COBOLや以前の言語、および古いIBMコンピューターでサポートされているように、10進演算の形式ですでに存在します。小数点を前に置き、2を掛け、1を引きます。

于 2013-01-02T00:44:42.503 に答える