0

私はリーダーボードを実装するために私のアプリケーションの機能に取り組んできました - 基本的にスコアに応じてユーザーをランク付けします。私は現在、個人ベースでスコアを追跡しています。私の考えでは、このリーダーボードは絶対的なものではなく相対的なものであるべきです。つまり、サイト全体で最高得点の上位 10 人のユーザー、つまりユーザーの友人ネットワークの上位 10 人を表示するのではありません。誰もが自分のネットワークで 1 位になるチャンスがあり、この種のことに関心のある人には友好的な競争の形があるため、これはより良いように思えます。私はすでに各ユーザーのスコアを保存しているので、課題はそのスコアのランクをリアルタイムで効率的な方法で計算する方法です。私は Google App Engine を使用しているため、いくつかの利点と制限があります (例:

例えば

1st ジャック 100

2nd ジョン 50

これが私が思いついたアプローチですが、どれも非効率的であるように思われ、このコミュニティはもっと洗練されたものを考え出すことができると思いました. 私の感覚では、すべてのソリューションは cron で行われる可能性が高く、読み取り操作を最適化するために毎日のランクとリストの順序を保存しますが、より軽量でリアルタイムなものがあればクールです

  1. スコア順に並べられたサイトのすべてのユーザーのリストを取得します。ユーザーごとに、そのリストから友達を選び、新しいランキングを作成します。ランクとリスト順を格納します。毎日更新します。短所 - 多くのユーザーを獲得すると、これには永遠に時間がかかります

2a. ユーザーごとに友達を選び、友達ごとにスコアを選びます。そのリストを並べ替えます。ランクとリスト順を格納します。毎日更新します。各ユーザーの最後の位置を記録して、既存のリストを使用して次の更新の並べ替えを効率化できるようにします (並べ替え時間を節約できます)。

2b. 前日にプロファイルが表示された人のランクとリストの順序のみを計算することを除いて、上記と同じ 短所 - プロファイルを表示した 2 番目のユーザーのランクのみが最新です

4

2 に答える 2

4

読み取りに比べて書き込みが非常にまれな場合 (キー値ストアだけでなく、ほとんどのキー値ストアで重要な仮定です;-)、スコアの更新 (書き込み) が必要なときに、時間のかかる時間を取ることを好むかもしれません。相対的なリーダーボードを取得します (読み取り)。具体的には、ユーザーのスコアが変化した場合、各友人のタスクをキューに入れ、「相対リーダーボード」を更新し、それらのリーダーボードをリスト属性として保持します (これは順序を維持します!-) 適切にソートされます (そうです、後者は非正規化です。多くの場合、非正規化、つまり情報を適切に複製して、キー値ストアを最大限に活用する必要があります!-)。

もちろん、友情 (ユーザー間の接続) が消えたり現れたりしたときにも相対的なリーダーボードを更新しますが、それらは (私が想像するに) スコアの更新よりもさらにまれなはずです;-)。

完全に正確な最新の情報は必要ないため (つまり、財務/会計に関するものではありません;-)、書き込みがかなり頻繁に行われる場合でも、試すことができる多くの実行可能なアプローチがあります。

たとえば、大きなスコアの変更 (まれ) は相対リーダーボードの再計算をトリガーする可能性がありますが、小さなもの (より頻繁) は隠され、「それに慣れたとき」にたまにのみ適用されます。さまざまな規模の更新の頻度、典型的なネットワーク フレンドシップ クラスタのサイズなどについて、概算の数字がなければ、より具体的に説明することは困難です。問題の...しかし、あなたはそれを見つけることができません!-)

于 2009-10-27T04:01:13.137 に答える
1

ランキングを保存するために利用できる Python ライブラリがあります。

http://code.google.com/p/google-app-engine-ranklist/

于 2009-10-27T19:18:14.630 に答える