問答排序演算法

2022-03-05 02:08:06 字數 2368 閱讀 8190

本來想以知乎問題及回答演算法進行分析,然而知乎的好像沒有引入時間的概念,有需要的可以去這裡看一下: ;

這裡說一下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 ...