上一篇文章,我介紹了Reddit的排名算法。
它的特點(diǎn)是,用戶可以投贊成票,也可以投反對票。也就是說,除了時(shí)間因素以外,只要考慮兩個(gè)變量就夠了。
但是,還有一些特定用途的網(wǎng)站,必須考慮更多的因素。世界排名第一的程序員問答社區(qū)Stack Overflow,就是這樣一個(gè)網(wǎng)站。

你在上面提出各種關(guān)于編程的問題,等待別人回答。訪問者可以對你的問題進(jìn)行投票(贊成票或反對票),表示這個(gè)問題是不是有價(jià)值。

一旦有人回答了你的問題,其他人也可以對這個(gè)回答投票(贊成票或反對票)。

排名算法的作用是,找出某段時(shí)間內(nèi)的熱點(diǎn)問題,即哪些問題最被關(guān)注、得到了最多的討論。
在Stack Overflow的頁面上,每個(gè)問題前面有三個(gè)數(shù)字,分別表示問題的得分、回答的數(shù)目和該問題的瀏覽次數(shù)。以這些變量為基礎(chǔ),就可以設(shè)計(jì)算法了。

創(chuàng)始人之一的Jeff Atwood,曾經(jīng)在幾年前,公布過排名得分的計(jì)算公式。

寫成php代碼,就是下面這樣:

各個(gè)算法變量的含義如下:
(1)Qviews(問題的瀏覽次數(shù))
![]()
某個(gè)問題的瀏覽次數(shù)越多,就代表越受關(guān)注,得分也就越高。這里使用了以10為底的對數(shù),用意是當(dāng)訪問量越來越大,它對得分的影響將不斷變小。
(2)Qscore(問題得分)和Qanswers(回答的數(shù)量)

首先,Qscore(問題得分)= 贊成票-反對票。如果某個(gè)問題越受到好評,排名自然應(yīng)該越靠前。
Qanswers表示回答的數(shù)量,代表有多少人參與這個(gè)問題。這個(gè)值越大,得分將成倍放大。這里需要注意的是,如果無人回答,Qanswers就等于0,這時(shí)Qscore再高也沒用,意味著再好的問題,也必須有人回答,否則進(jìn)不了熱點(diǎn)問題排行榜。
(3)Ascores(回答得分)
![]()
一般來說,”回答”比”問題”更有意義。這一項(xiàng)的得分越高,就代表回答的質(zhì)量越高。
但是我感覺,簡單加總的設(shè)計(jì)還不夠全面。這里有兩個(gè)問題。首先,一個(gè)正確的回答勝過一百個(gè)無用的回答,但是,簡單加總會導(dǎo)致,1個(gè)得分為100的回答與100個(gè)得分為1的回答,總得分相同。其次,由于得分會出現(xiàn)負(fù)值,因此那些特別差的回答,會拉低正確回答的得分。
(4)Qage(距離問題發(fā)表的時(shí)間)和Qupdated(距離最后一個(gè)回答的時(shí)間)

改寫一下,可以看得更清楚:

Qage和Qupdated的單位都是秒。如果一個(gè)問題的存在時(shí)間越久,或者距離上一次回答的時(shí)間越久,Qage和Qupdated的值就相應(yīng)增大。
也就是說,隨著時(shí)間流逝,這兩個(gè)值都會越變越大,導(dǎo)致分母增大,因此總得分會越來越小。
(5)總結(jié)
Stack Overflow熱點(diǎn)問題的排名,與參與度(Qviews和Qanswers)和質(zhì)量(Qscore和Ascores)成正比,與時(shí)間(Qage和Qupdated)成反比。
(完)
轉(zhuǎn)載自:阮一峰的網(wǎng)絡(luò)日志
哈爾濱品用軟件有限公司致力于為哈爾濱的中小企業(yè)制作大氣、美觀的優(yōu)秀網(wǎng)站,并且能夠搭建符合百度排名規(guī)范的網(wǎng)站基底,使您的網(wǎng)站無需額外費(fèi)用,即可穩(wěn)步提升排名至首頁。歡迎體驗(yàn)最佳的哈爾濱網(wǎng)站建設(shè)。
