如绝大多数的新闻客户端和某些社区(比较著名的如reddit),都是根据某个算法算出一个权重值,再根据这个权重值进行排序(参考:http://www.ruanyifeng.com/blog/2012/03/ranking_algorithm_reddit.html)
手机app的场景下,应该怎么样去综合提高这个排序性能呢?
请有经验人士提供一些思路。
PHPz2017-04-17 13:06:26
這問題放在 Android 的節點下,你是要在 Android 下實現權重運算?
要是在伺服器的話,贊同 @zys 的方案,另外,要降低計算數量,私有以下愚見:
為要計算的資料加上一個updated_at 和calculated_at 字段,分別表示資料最新的更新時間和最後一次用排序演算法計算權重值的時間。當有新的用戶投票,更新資料的 updated_at 欄位。定時任務計算權重後,更新資料的 calculated_at 欄位。
權重計算演算法裡對updated_at 和calculated_at 作比較,當calculated_at > updated_at 的時候,<>權重值。
天蓬老师2017-04-17 13:06:26
我以前做過類似的事是這樣處理的,將耗時的計算放在每天凌晨用定時任務去做,然後結果存在order字段或者一個排序表裡,讀數據的時候order by或者關聯下表查詢就可以了。
伊谢尔伦2017-04-17 13:06:26
可以單獨放一個表出來, 當文章可能影響權重的內容改變時, 直接更新表裡的值, 應該可以承受相當大的數量了. 即便以後再增長, 可以只對一段時間內的文章進行排序, 應該不會有問題.
怪我咯2017-04-17 13:06:26
提升一個高度來回答這個問題,或許對你的思路會有幫助。
提升效能的方式無非就幾種常見的思路,順著想一下一般都會有自己的結論。
提升算法的效率
:權重的計算公式盡量不要有太高的複雜度可以提升運算速度。 用空间换时间
:權重的計算結果放到一個臨時欄位去記錄,這樣排序的時候就不用重複計算權重。 避免不必要的运算
:移除對結果影響不大的運算,例如一個月之前的資料不納入排序,減少運算的資料規模。 用近似值代表准确值
:不要即時的去計算權重,定時去刷新權重可以有效減少運算次數。