ユーザーポイントに基づいてレベルを判定します
リーリーユーザーのポイントに基づいてレベルを迅速かつ効率的に決定するにはどうすればよいですか?数件のif判定ならまだしも、100件あると効率が落ちてしまいます 何か良い方法はありませんか?
ユーザーポイントに基づいてレベルを判定します
リーリーユーザーのポイントに基づいてレベルを迅速かつ効率的に決定するにはどうすればよいですか?数件のif判定ならまだしも、100件あると効率が落ちてしまいます 何か良い方法はありませんか?
皆さんがこの問題の解決に積極的に協力してくれて、本当にありがとうございます。このコラムは「回答を書く」と呼ばれていますが、実際には回答ではなく、単に私のニーズを満たすものです。
この解決策は、実際にはユーザーのオンライン時間に基づいてユーザーのレベルを判断し、一定の時間を満たした後に特定のレベルにアップグレードするというものです。その後、この方法をユーザーのレベル時間の2乗で判断するために使用することが決定されました。現在のレベルが次のレベルに必要な時間数です。
最後に、期間に基づいてユーザーレベルを見つけます
リーリー
ユーザー レベルの情報をデータベースに直接保持して保存することをお勧めします。そうしないと、単純な範囲クエリ SQL を使用するとインデックスが失敗する可能性があります。
データが不規則でデータベースに保存したくない場合は、二分探索を使用して、すべてのレベルの中間レベルのポイントの上限を見つけます。ユーザーのポイントがこの上限を超えている場合は、それ以外の場合は、この中間レベルよりも小さいレベルを再帰的に検索します。 。
コメント内の「ポイント/50 アルゴリズム」は、ポイント レベルのルールが変更される可能性があり、アルゴリズム自体に問題があるため、投稿者のポイント レベルの判断を明らかに満たすことができません。
順序付けされたデータの検索はバイナリメソッドを使用して実行できます。簡単な実装コードを次に示します。 リーリー
1. ユーザーテーブルに冗長なレベルフィールドがあります。新しいポイントが追加されるたびに、レベルが向上すると判定されます。これはリアルタイムソリューションです。
2. レベル昇格の遅延が許容される場合は、事前に計画されていると考えられるため、長期的にはポイントが比較的読み込まれる可能性があるため、スケジュールされたタスクまたは非同期キュー処理計算を使用することをお勧めします。
ポイントを介してレベルを取得するためにこれを本当に実行したい場合は、すべてのキーと値のペアを直接定義し、時間を交換するためにスペースを使用することをお勧めします。実際のビジネス ロジックには多くのレベルはなく、アルゴリズムはまったく必要ありません。これは最もパフォーマンスの高い方法です。この配列を生成するコードを自分で作成できます
$arr[1]=“lv1”;$arr[2]=“lv1”;....$arr[50 ]= lv1";$arr[51]="lv2";$arr[52]="lv2";....$arr[110]="lv2";
...
。 ..
...
...
ルールはどうなりますか?ルールがなければルールも存在しない
= = 最初のアイデアは、switch ステートメントを使用することでした。2 階を見た後、私はまだ勉強を続ける必要があると感じました。
データベースを使用すると、より信頼性が高くなります。ループやif判定の性能が満たされていません。データベースには 100 件の小規模なデータ ケースが保存されており、簡単にクエリできます。また、データのパターンがプログラムでの判定に適していません。
私は二階で最初の解決策を採用しました
$rules = 配列(
リーリー
)99 ポイント
配列を走査
foreach($rules as $k=>$v){
リーリー
}
<code class="php">function getLevel($point) { $level = [ 0 => ['max' => 1000, 'min' => 0, 'name' => '新手', 'level' => 1], 1 => ['max' => 10000, 'min' => 1000, 'name' => '小将', 'level' => 2], 2 => ['max' => 20000, 'min' => 10000, 'name' => '中将', 'level' => 3], 3 => ['max' => 50000, 'min' => 20000, 'name' => '上将', 'level' => 4], 4 => ['max' => 100000, 'min' => 50000, 'name' => '大将', 'level' => 5], 5 => ['max' => 999999999, 'min' => 100000, 'name' => '将军', 'level' => 6], ]; foreach ($level as $value) { if (($point >= $value['min']) && ($point < $value['max'])) { return $value; } } }</code>
效率不高,期待更好算法。
<code>public function gradefun($gf)//用户等级函数 { $arr = array(120000 => 12, 80000 => 11, 50000 => 10, 30000 => 9, 12000 => 8, 8000 => 7, 5000 => 6, 2500 => 5, 1200 => 4, 500 => 3, 100 =>2, 0 => 1); foreach ($arr as $key => $value) { if ($gf >= $key) { return $value; } } } 这个可以解决等级数小的,大的不清楚,没用过。</code>