アイテムの年齢とアイテムが受け取る投票数、クリック数、または購入数に基づいて人気度を計算するためには、多くのものがあります(suggested algorithms)。しかし、私が見てきたよりロバストな方法は、過度に複雑な計算や複数の格納された値を必要とすることが多く、データベースが乱雑になります。私は、変数(人気値そのもの以外)を格納する必要がなく、の1つだけの計算が必要な非常に単純なアルゴリズムを検討しています。それは途方もなく簡単です:単純な人気アルゴリズム
p = (p + t)/2
ここで、pはデータベースに保存されている人気の値であり、tは現在のタイムスタンプです。項目を最初に作成するときは、pを初期化する必要があります。
- 初期データベース
注全てP値の平均値と現在のタイムスタンプとPT
初期化方法(1)を使用して、pを現在のタイムスタンプで初期化したとします。アイテムが最初の投票を受け取ると、pが作成時間と投票時間の平均になります。したがって、人気値pは有効なタイムスタンプを表します(最も近い整数に丸めたと仮定します)。ただし、実際の時刻が抽象化されています。
この方法では、単純な計算が1つだけ必要で、データベースに格納する必要がある値は1つだけです(p)。この方法はまた、特定のアイテムの人気が現在の時間を決して超えることができないので、暴走値を防止する。
1日の期間にわたり職場でのアルゴリズムの例:http://jsfiddle.net/q2UCn/
1年間の期間にわたり職場でのアルゴリズムの例:http://jsfiddle.net/tWU9y/
あなたが投票は着実にサブででストリーミングすることが予想される場合秒間隔を使用する場合は、PHP microtime()
関数などのマイクロ秒のタイムスタンプを使用する必要があります。それ以外の場合は、PHP time()
のような標準のUNIXタイムスタンプが機能します。
私の質問のために:あなたはこのアプローチで大きな欠陥を見ますか?
人が「違う」アイテムを許可した場合、これはデータベースにpを格納することのみを必要としません。あなたはまた、今まで作られたすべてのLikeのレコードを保存しなければなりません。そうでなければ、ユーザーは好き、好き、好き、好き、好き、好き嫌い、好き嫌い、投票違反を繰り返すことができます。 あなたが言ったように、アイテムの最初の投票を受け取ったときにアイテムのpを変更したいだけです。意味することは、すべての投票を追跡する必要があるということです。 –
@AlSweigart良い点。このアルゴリズムは、単方向投票システム(例えば、ページビューが正の 方向の1つの「投票」であるなど)にのみ適していると考えられます。おそらく双方向投票システムとの互換性は低いでしょう。 –