本來想以知乎問題及回答演算法進行分析,然而知乎的好像沒有引入時間的概念,有需要的可以去這裡看一下: ;
這裡說一下stackoverflow之前使用的演算法
stackoverflow的排序共分為兩類,1個是問題排序,1個是答案排序。這裡主要介紹的是關於熱門問題的排序。
在分析問題前可以先考慮下,如果是你來做這個排名演算法需要考慮哪些因素?
在08年8月23日的時候,stackoverflow的創始人 jeff atwood曾經公布了乙個熱門問題的排名演算法(鏈結):具體為
此演算法目前是否還繼續使用或者是否改變不得而知。下面我們詳細介紹下問題排名中涉及到的變數。將其轉化成python**為:12
345import time,math
def hot(qviews,qanswers,qscore,ascore,date_ask,date_active):
qage=round((time.time()-date_ask)/3600)
qupdated=round((time.time()-date_active)/3600)
return(math.log10(qviews)*4+qanswers *qscore/5+ascore)/(pow((qage+1)-(qage-qupdated)/2,1.5))
qviews(問題的瀏覽次數)
log(qviews)*4
某個問題的瀏覽次數越多,就代表越受關注,得分也就越高。這裡使用了以 10為底的對數,用意是當訪問量越來越大,它對得分的影響將不斷變小。
qscore(問題得分)和 qanswers(回答的數量)
(qanswers * qscore)/5
qscore(問題得分)= 贊成票-反對票。如果某個問題越受到好評,排名自然應該越靠前。qanswers 表示回答的數量,代表有多少人參與這個問題。這個值越大,得分將成倍放大。這裡需要注意的是,如果無人回答,qanswers 就等於0,這時 qscore 再高也沒用,意味著再好的問題,也必須有人回答,否則進不了熱點問題排行榜。
ascores(回答得分)
sum(ascores)
一般來說,」回答」比」問題」更有意義。這一項的得分越高,就代表回答的質量越高。但是簡單加總的設計還不夠全面。這裡有兩個問題。首先,乙個正確的回答勝過一百個無用的回答,但是,簡單加總會導致,1個得分為 100 的回答與 100 個得分為 1 的回答,總得分相同。其次,由於得分會出現負值,因此那些特別差的回答,會拉低正確回答的得分。
qage(距離問題發表的時間)和 qupdated(距離最後乙個回答的時間)
((qage+1) – ((qage – qupdated)/2)) ^ 1.5
qage 和 qupdated 的單位都是小時。如果乙個問題的存在時間越久,或者距離上一次回答的時間越久,qage 和 qupdated 的值就相應增大。也就是說,隨著時間流逝,這兩個值都會越變越大,導致分母增大,因此總得分會越來越小。
總結:stack overflow 熱點問題的排名,與參與度(qviews 和 qanswers)和質量(qscore 和 ascores)成正比,與時間(qage 和 qupdated)成反比。
關於上述的答案是否合理的,是否可以再改良,答案是肯定的,如果是你你會怎樣去推薦熱門問答呢?
————————-巨大的分割線——————————–
update:2018-05-17
今天對stackoverflow的演算法進行了重新解讀,加上了自己的理解和思考。正確的公式應該為:
上面的公式和一開始的公式是等價的,但是下面的更容易理解。針對該公式的理解和思考:
為什麼不使用「聲望值」?
提問的目的是獲得正確的答案,而不是誰參與了此問題。聲望值納入容易造成,在沒有聲望認識加入的情況下,問題無法進入熱門榜。
瀏覽量與分值的關係
為什麼對瀏覽量做了一次對數處理?防止瀏覽量較大的問答佔著榜單不動,抑制馬太效應。
為什麼還要
4?以10為底的對數,制止作用過大,乘4稍微加大權重的影響。
優化空間?
為什麼用2為底?因為喜歡優美….
答案數和投票數與分值關係
為什麼要相
?與回答數量正相關?同時與得分正相關?這點無法理解。
為什麼要
5?降低答案數、投票分的權重,考慮到問題答案的權重較少,猜想是想降低問答數的影響。
是否合理?
優化空間?
答案投票數與分值關係
是否合理?
優化空間?
只取投票數為正的答案,取每個分值平方和的開方
提問時間與最後解答時間與分值關係
為什麼要
1?防止問題剛提交時,公式中分母為0
為什麼要
2?把2小時作為最小的時間粒度單位
為什麼要去1.5次方?新增「重力加速度」,提公升曲線的陡度
如何理解影響關係?
演算法設計複習之概念和問答
演算法是指解決問題的準確方法或步驟。演算法的時間複雜度,是用來衡量演算法的執行時間,記做o f n 演算法執行的時間的增長速度可以用f n 表示。貪心法就是在每一步選擇中都做最好的選擇,從而希望結果是最好的演算法。將乙個難以解決的大問題,分割成多個較小的相同問題,逐個擊破。搜尋演算法是指利用計算機的...
排序演算法 排序演算法彙總
排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...
排序演算法 排序演算法彙總
排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...