0

Redis を使用して (ソート済みセットを使用して) 文字列値をソートしたいのですが、その目的には float しか使用できません。順序を保ちながら、文字列を float 0..1 値に変換するアルゴリズムを探しています。

つまり、s1 < s2 (アルファベット順) は、f(s1) < f(s2) を意味するはずです。

そのようなアルゴリズムはありますか?

PS私はこのようなアルゴリズムを使用してユーザー名を並べ替えますが、ほとんどの場合、スコアが一致するプレイヤーのユーザー名はまったく異なります。そのため、ほとんどの場合、どちらのアプローチも機能するはずですが、衝突の余地はまだあります。一方、文字列はほとんど正しくソートされず、ほとんど同じユーザー名が正しくソートされなくても許容されます。

4

2 に答える 2

3

各文字は、そのASCII番号にマップできます。各文字列を、すべてのASCII数値を連結する同等のfloatに変換すると(すべての文字が3つの数値にマップされるように、最終的にはそれらの前にゼロが付きます)、順序付けを続けます。ただし、文字列が長い場合、フロートは巨大になり、マッピングは一意ではない可能性があります(フロート内の丸めのために、複数の文字列が同じ文字で始まる場合)。

例えば:

'hello' -> 104101108108111

文字列に含まれる文字のサブセット(たとえば、小文字のみ、または大文字と数字のみ)がわかっている場合は、文字ごとに使用する数字を少なくする独自のマッピングを作成できます。

于 2013-03-06T13:13:58.297 に答える
1

数学的には、このようなアルゴリズムは存在し、簡単です。文字列の前に小数点( "。")を置き、それをベース256の数字として解釈します(文字列が8ビット文字を使用していると仮定します)。同様に、文字列に「0」から「9」までの文字だけが含まれている場合は、文字列「58229」の.58229のように、10進数として読み取ることになります。同じことをしていますが、基数10ではなく基数256を使用しています。

実際には、これは、厳しく制限された潜在的な文字列のセットまたは特別な浮動小数点ソフトウェアなしでは不可能です。一般的な浮動小数点オブジェクトのサイズは有限であるため、可能な値の数は有限です。たとえば、64ビットの浮動小数点オブジェクトは最大で2 64の値を持ち、NaNなどの特別な概念を表す値を無視します。逆に、任意の長さの文字列には、無限に多くの潜在的な値があります。文字列を今日のコンピュータメモリで妥当なものに制限したとしても、通常の浮動小数点オブジェクトよりもはるかに多くの潜在的な値があります。

これを解決するには、潜在的な文字列の数を減らす(長さを制限するか、許可される文字列を制限する)か、潜在的な浮動小数点値の数を増やす(おそらく、特別な任意精度の浮動小数点ソフトウェアを使用する)必要があります。

于 2013-03-06T14:00:36.277 に答える