2012-01-18 130 views
2

我正在開發一個類似於Digg的web應用程序,我需要一個算法來用來按照流行度排序。例如:在第一頁上,我想擁有今天最受歡迎的帖子,而且幾天之前已經獲得了足夠的選票。我的db現在看起來像這樣:投票加權算法

Table | fields 
Posts | id | ... | time 
Feedback | id | userid | time | upvote 

upvote字段是bool。如果是肯定的,則意味着用戶點擊了投票按鈕。

我的表格可以修改,因爲它們是空的。

任何幫助將不勝感激

+0

爲什麼不選擇[KISS](http://en.wikipedia.org/wiki/Keep_it_simple_stupid)並根據最後* X *小時內的投票數排名?或者可能使用延時過濾器.... – wallyk 2012-01-18 23:05:00

回答

2

我個人喜歡採取更復雜的方法。總體思路是每5分鐘計算一次cron處理器,根據您提到的標準計算每個實體的受歡迎程度,並根據用戶standard deviation消除團伙投票的明顯集會,以提升其社交圈內的內容。

看看勞森的答案是一個好主意,用來分解投票年齡。但考慮到根據聲譽,資歷等原因應用用戶自己的體重可能會有所幫助。

不幸的是,這並不簡單。儘管我發現它比大多數網絡編程更有趣,但考慮到遊戲的所有基本心理因素可能是一個非常耗時的過程,並且可能不是你想到的,除非你碰巧爲Digg本身工作,或者成爲嚴重啓動。

這裏的php.net標準偏差:http://php.net/manual/en/function.stats-standard-deviation.php

雖然我覺得這個蘇答案是更重要的一點:z-Scores(standard deviation and mean) in PHP

代碼樣本可能是好的,但我們需要一些數據做所以即使這樣,這可能會變得相當複雜。但它絕對有趣。特別是當你的代碼發現人們試圖遊戲系統。

5

如果我理解正確的話,你想投的價值是成反比它的年齡。 (投票越早,它就越不會影響您的人氣指數。)

實現此目的的一個簡單方法是將投票轉換爲受歡迎程度單位(PU),並且不只是簡單投票,而是總和。 PU的構建可以簡單到使其等於1 /(投票的年齡以天或小時爲單位)。一天的投票價值1 PU,而2天的投票則價值一半。