1

たとえば。2つの文字列2と10がある場合、辞書式順序で注文すると10が最初になります。

非常に些細な解決策は、文字をn回繰り返すことです。

eg. 2 can be encoded as aa

10 as aaaaaaaaaa

This way the lex order is same as the numeric one.

しかし、これを行うためのよりエレガントな方法はありますか?

4

3 に答える 3

6

数値を文字列に変換するときは、必要に応じて先頭に0を追加して、すべての文字列の長さが同じであることを確認してください。したがって、2と10は「02」と「10」としてエンコードされます。

于 2012-10-05T18:02:11.753 に答える
3

kjampaniのソリューションは、通常のアプリケーションではおそらく最良かつ最も簡単ですが、よりスペース効率の良い別の方法は、すべての文字列に独自の長さを付加することです。もちろん、一貫してソートされる方法で長さをエンコードする必要があります。

すべての文字列がかなり短いことがわかっている場合は、それらの長さを固定長のbase-Xシーケンスとしてエンコードできます。ここで、Xは使用する文字コードの数です(一般的な値は64、96、255、および256.)文字コードを字句順に使用する必要があるため、通常のbase64は機能しないことに注意してください。

可変長の順序保持エンコーディングの1つは、UTF-8で使用されるエンコーディングです。(UTF-8を直接使用するのではなく、邪魔になるいくつかのコーナーケースがありますが、同じエンコード手法です。UTF-8の順序保持プロパティは、非常に便利な場合があります。)このような圧縮コードの全範囲で最大42ビット長の値をエンコードし、1バイトあたり平均5ペイロードビットを使用します。かなり長い文字列にはこれで十分です。4テラバイトの長さの文字列は、実際には非常にまれです。ただし、もっと長く必要な場合は、サイズプレフィックスを複数のバイトに拡張することも可能です。

于 2012-10-05T21:19:05.477 に答える
-1

文字列を文字と数字の連続するサブ文字列に分割し、数値文字列の場合は各サブ文字列を整数として比較して並べ替えます

"aaa2" ---> aaa + 2

"aaa1000" ---> aaa + 1000

aaa == aaa

それらは等しいので、続けます:

1000> 2

したがって、aaa1000>aaa2です。

于 2012-10-05T18:29:27.980 に答える