その後、実際にdouble
情報を保存できると言いましたが、32 ビット整数でこれを行うことについて、いくつかの考えを共有できると思いました。
まず、これらの数値を最初にスコア順、2 番目に時間順に並べ替えるには、スコアが高い値の場所を占め、タイムスタンプが低い場所を占めるようにします。スコアをより高い値の場所に配置するには、一定の係数を掛ける必要があります。符号なし 32 ビット整数で表現できる最大数は 4,294,967,295 で、スコア範囲は 0 から 1,000,000 です。これにより、乗数は 4,294 になります。
次に、タイムスタンプが占有する値の小さい位置を取得します - それを追加するだけです。これにより、次のようになります。
N = SCORE * 4294 + TIMESTAMP;
逆変換は次のとおりです。
SCORE = N / 4294;
TIMESTAMP = N % 4294;
ただし、これが許容する範囲TIMESTAMP
は 0 ~ 4293 であることに注意してください。N
それ以上のものは、 によって占有されている の部分にオーバーフローしSCORE
ます。を単純な秒数 (最も古いスコアの4293TIMESTAMP
からカウントダウン) とすると、最も古いスコアから最新のスコアまでの最大時間は 71 分強しかなく、おそらく不十分です。
これは、32 ビット整数で表現できるさまざまなバケットの数の制限にすぎません。このモデルでより明確なタイムスタンプを表現できるようにするには、表現できる個別のスコアの数を減らす必要があります。
ただし、タイムスタンプをタイムスタンプとして実際に必要としているわけではないことに注意してください。スコアの単調な順序としてのみ必要です。別の方法として、カウンターを保持することもできます。カウンターを 4293 に初期化します。新しいスコアが入ってきたら、カウンターの現在の値を「タイムスタンプ」として保存し、カウンターをデクリメントします。これにより、カウンターがなくなる前に 4294 の異なるハイスコアを保存できます。
さらなる改良として、同じSCORE
値内の順序のみを気にすることに注意してください。これは、別の代替案を示唆しています。新しいハイ スコアが表示されたら、そのスコアの現在の最低 TIMESTAMP 値を見つけます。それを 1 減らし、それを新しいスコアの「タイムスタンプ」に使用します (これが初めてSCORE
提出された場合は、タイムスタンプとして 4293 を使用します)。これにより、個々のスコア値ごとに 4294 のハイ スコアが可能になります。