精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

海量用戶積分排名算法探討

開發 后端 算法
下面介紹了用戶積分排名的幾種算法,算法1簡單易于理解和實現,適用于小規模和低并發應用;算法3引入了更復雜的樹形分區結構,但是 O(log(n))的復雜度性能優越,可以應用于海量規模和高并發;算法4采用簡單的排名數組,易于實現,在積分變化不大的情況下性能不亞于算法3。本問題是一個開放性的問題,相信一定還有其他優秀的算法和解決方案,歡迎探討!

問  題

某海量用戶網站,用戶擁有積分,積分可能會在使用過程中隨時更新?,F在要為該網站設計一種算法,在每次用戶登錄時顯示其當前積分排名。用戶***規模為2億;積分為非負整數,且小于100萬。

PS: 據說這是迅雷的一道面試題,不過問題本身具有很強的真實性,所以本文打算按照真實場景來考慮,而不局限于面試題的理想環境。

存儲結構

首先,我們用一張用戶積分表user_score來保存用戶的積分信息。

表結構:

user<em />score</em>schema

示例數據:

user<em />score</em>sample

下面的算法會基于這個基本的表結構來進行。

算法1:簡單SQL查詢

首先,我們很容易想到用一條簡單的SQL語句查詢出積分大于該用戶積分的用戶數量:

select 1 + count(t2.uid) as rank
from user_score t1, user_score t2
where t1.uid = @uid and t2.score > t1.score

對于4號用戶我們可以得到下面的結果:

sql_1

算法特點

優點:簡單,利用了SQL的功能,不需要復雜的查詢邏輯,也不引入額外的存儲結構,對小規模或性能要求不高的應用不失為一種良好的解決方案。

缺點:需要對user_score表進行全表掃描,還需要考慮到查詢的同時若有積分更新會對表造成鎖定,在海量數據規模和高并發的應用中,性能是無法接受的。

算法2:均勻分區設計

在許多應用中緩存是解決性能問題的重要途徑,我們自然會想能不能把用戶排名用Memcached緩存下來呢?不過再一想發現緩存似乎幫不上什么忙,因為用戶排名是一個全局性的統計性指標,而并非用戶的私有屬性,其他用戶的積分變化可能會馬上影響到本用戶的排名。然而,真實的應用中積分的變化其實也是有一定規律的,通常一個用戶的積分不會突然暴增暴減,一般用戶總是要在低分區混跡很長一段時間才會慢慢升入高分區,也就是說用戶積分的分布總體說來是有區段的,我們進一步注意到高分區用戶積分的細微變化其實對低分段用戶的排名影響不大。于是,我們可以想到按積分區段進行統計的方法,引入一張分區積分表 score_range:

表結構:

score<em />range</em>schema

數據示例:

score<em />range</em>sample

表示[from_score, to_score)區間有count個用戶。若我們按每1000分劃分一個區間則有[0, 1000), [1000, 2000), …, [999000, 1000000)這1000個區間,以后對用戶積分的更新要相應地更新score_range表的區間值。在分區積分表的輔助下查詢積分為s的用戶的排名,可以首先確定其所屬區間,把高于s的積分區間的count值累加,然后再查詢出該用戶在本區間內的排名,二者相加即可獲得用戶的排名。

乍一看,這個方法貌似通過區間聚合減少了查詢計算量,實則不然。***的問題在于如何查詢用戶在本區間內的排名呢?如果是在算法1中的SQL中加上積分條件:

select 1 + count(t2.uid) as rank
from user_score t1, user_score t2
where t1.uid = @uid and t2.score > t1.score and t2.score < @to_score

在理想情況下,由于把t2.score的范圍限制在了1000以內,如果對score字段建立索引,我們期望本條SQL語句將通過索引大大減少掃描的user_score表的行數。不過真實情況并非如此,t2.score的范圍在1000以內并不意味著該區間內的用戶數也是1000,因為這里有積分相同的情況存在!二八定律告訴我們,前20%的低分區往往集中了80%的用戶,這就是說對于大量低分區用戶進行區間內排名查詢的性能遠不及對少數的高分區用戶,所以在一般情況下這種分區方法不會帶來實質性的性能提升。

算法特點

優點:注意到了積分區間的存在,并通過預先聚合消除查詢的全表掃描。

缺點:積分非均勻分布的特點使得性能提升并不理想。

算法3:樹形分區設計

均勻分區查詢算法的失敗是由于積分分布的非均勻性,那么我們自然就會想,能不能按二八定律,把score_range表設計為非均勻區間呢?比如,把低分區劃密集一點,10分一個區間,然后逐漸變成100分,1000分,10000分 … 當然,這不失為一種方法,不過這種分法有一定的隨意性,不容易把握好,而且整個系統的積分分布會隨著使用而逐漸發生變化,最初的較好的分區方法可能會變得不適應未來的情況了。我們希望找到一種分區方法,既可以適應積分非均勻性,又可以適應系統積分分布的變化,這就是樹形分區。

我們可以把[0, 1,000,000)作為一級區間;再把一級區間分為兩個2級區間[0, 500,000), [500,000, 1,000,000),然后把二級區間二分為4個3級區間[0, 250,000), [250,000, 500,000), [500,000, 750,000), [750,000, 1,000,000),依此類推,最終我們會得到1,000,000個21級區間[0,1), [1,2) … [999,999, 1,000,000)。這實際上是把區間組織成了一種平衡二叉樹結構,根結點代表一級區間,每個非葉子結點有兩個子結點,左子結點代表低分區間,右子結點代表高分區間。樹形分區結構需要在更新時保持一種不變量(Invariant):非葉子結點的count值總是等于其左右子結點的count值之和。

range_tree

以后,每次用戶積分有變化所需要更新的區間數量和積分變化量有關系,積分變化越小更新的區間層次越低??傮w上,每次所需要更新的區間數量是用戶積分變量的log(n)級別的,也就是說如果用戶積分一次變化在***,更新區間的數量在二十這個級別。在這種樹形分區積分表的輔助下查詢積分為s的用戶排名,實際上是一個在區間樹上由上至下、由粗到細一步步明確s所在位置的過程。比如,對于積分499,000,我們用一個初值為0的排名變量來做累加;首先,它屬于1級區間的左子樹[0, 500,000),那么該用戶排名應該在右子樹[500,000, 1,000,000)的用戶數count之后,我們把該count值累加到該用戶排名變量,進入下一級區間;其次,它屬于3級區間的[250,000, 500,000),這是2級區間的右子樹,所以不用累加count到排名變量,直接進入下一級區間;再次,它屬于4級區間的…;直到***我們把用戶積分精確定位在21級區間[499,000, 499,001),整個累加過程完成,得出排名!

雖然,本算法的更新和查詢都涉及到若干個操作,但如果我們為區間的from_score和to_score建立索引,這些操作都是基于鍵的查詢和更新,不會產生表掃描,因此效率更高。另外,本算法并不依賴于關系數據模型和SQL運算,可以輕易地改造為NoSQL等其他存儲方式,而基于鍵的操作也很容易引入緩存機制進一步優化性能。進一步,我們可以估算一下樹形區間的數目大約為200,000,000,考慮每個結點的大小,整個結構只占用幾十M空間。所以,我們完全可以在內存建立區間樹結構,并通過user_score表在O(n)的時間內初始化區間樹,然后排名的查詢和更新操作都可以在內存進行。一般來講,同樣的算法,從數據庫到內存算法的性能提升常常可以達到10^5以上;因此,本算法可以達到非常高的性能。

算法特點

優點:結構穩定,不受積分分布影響;每次查詢或更新的復雜度為積分***值的O(log(n))級別,且與用戶規模無關,可以應對海量規模;不依賴于SQL,容易改造為NoSQL或內存數據結構。

缺點:算法相對更復雜。

算法4:積分排名數組

算法3雖然性能較高,達到了積分變化的O(log(n))的復雜度,但是實現上比較復雜。另外,O(log(n))的復雜度只在n特別大的時候才顯出它的優勢,而實際應用中積分的變化情況往往不會太大,這時和O(n)的算法相比往往沒有明顯的優勢,甚至可能更慢。

考慮到這一情況,仔細觀察一下積分變化對排名的具體影響,可以發現某用戶的積分從s變為s+n,積分小于s或者大于等于s+n的其他用戶排名實際上并不會受到影響,只有積分在[s,s+n)區間內的用戶排名會下降1位。我們可以用于一個大小為100,000,000的數組表示積分和排名的對應關系,其中rank[s]表示積分s所對應的排名。初始化時,rank數組可以由user_score表在O(n)的復雜度內計算而來。用戶排名的查詢和更新基于這個數組來進行。查詢積分s所對應的排名直接返回rank[s]即可,復雜度為O(1);當用戶積分從s變為s+n,只需要把rank[s]到 rank[s+n-1]這n個元素的值增加1即可,復雜度為O(n)。

算法特點

優點:積分排名數組比區間樹更簡單,易于實現;排名查詢復雜度為O(1);排名更新復雜度O(n),在積分變化不大的情況下非常高效。

缺點:當n比較大時,需要更新大量元素,效率不如算法3。

總  結

上面介紹了用戶積分排名的幾種算法,算法1簡單易于理解和實現,適用于小規模和低并發應用;算法3引入了更復雜的樹形分區結構,但是 O(log(n))的復雜度性能優越,可以應用于海量規模和高并發;算法4采用簡單的排名數組,易于實現,在積分變化不大的情況下性能不亞于算法3。本問題是一個開放性的問題,相信一定還有其他優秀的算法和解決方案,歡迎探討!

 

原文鏈接:http://www.cnblogs.com/weidagang2046/archive/2012/03/01/massive-user-ranking.html

【編輯推薦】

  1. 推薦5個提高Java開發效率的工具
  2. 優秀開發者必備的四種品質
  3. 軟件開發基本原則之***項目
  4. 聘用Node.js開發者的六個建議
  5. 軟件開發如同木匠做桌子
責任編輯:林師授 來源: Todd Wei的博客
相關推薦

2012-02-29 10:36:48

算法

2012-09-19 09:57:34

AppStore排名

2010-12-10 08:51:13

Web 2.0Cache集群

2013-08-26 10:48:02

Reddit排名算法算法

2013-09-09 18:21:14

2013-08-22 09:53:52

Hacker News排名算法算法

2024-08-02 13:10:25

2017-11-16 19:26:34

海量數據算法計算機

2011-06-23 11:36:27

網站排名

2011-04-26 10:00:17

2010-04-14 12:38:56

Oracle海量數據

2013-08-12 13:05:58

騰訊移動分析大數據

2010-05-04 17:05:29

DNS負載均衡

2011-04-19 09:28:25

App Store蘋果應用商店

2012-04-25 22:58:36

2021-03-29 15:25:47

算法開源技術

2012-04-28 16:23:33

蘋果App Store排名算法

2012-03-26 10:00:02

App Store

2017-02-09 11:05:11

大數據用戶畫像技術

2011-06-21 17:48:24

SEO關鍵詞
點贊
收藏

51CTO技術棧公眾號

久久九九99视频| 国产一区二区三区日韩精品| 亚洲免费视频中文字幕| 亚洲综合日韩在线| 国产在线视频99| 一区二区三区韩国免费中文网站| 色综合天天视频在线观看| 亚洲乱码一区二区三区三上悠亚| 国产日韩在线观看一区| 一区二区在线| 亚洲日本成人女熟在线观看| 国产美女18xxxx免费视频| 国产天堂在线播放视频| 久久久久久久久一| 91九色单男在线观看| 国产午夜视频在线播放| 久久影院一区| 亚洲精品白浆高清久久久久久| 超碰在线播放91| 国产社区精品视频| 亚洲手机成人高清视频| 欧美大香线蕉线伊人久久国产精品 | 日韩免费在线电影| 在线免费三级电影网站| 日韩高清不卡一区二区三区| 欧美成人精品在线观看| 欧美黄色激情视频| 岛国精品一区| 欧美精品一卡两卡| 黄色a级片免费| 爱情岛论坛亚洲品质自拍视频网站| 国产欧美日韩不卡免费| 极品尤物一区二区三区| 99热这里只有精品66| 日本vs亚洲vs韩国一区三区二区 | 国产精品一区二区黑丝| 国产精品第8页| 日韩欧美三级在线观看| 欧美激情综合色综合啪啪| 中文字幕在线视频日韩| 国产乱了高清露脸对白| 超碰97久久国产精品牛牛| 777色狠狠一区二区三区| 国产精品涩涩涩视频网站| bbw在线视频| 亚洲在线观看免费| 蜜桃网站在线观看| 黄色免费网站在线| 国产精品国产三级国产a | 国产亚洲依依| 99久久777色| 国产伦视频一区二区三区| 99在线精品视频免费观看软件| 91大神xh98hx在线播放| 国产精品久久久久毛片大屁完整版| 美女性感视频久久久| 国产人与禽zoz0性伦| 国产一区三区在线播放| 亚洲男人的天堂在线播放| 久久久久久久人妻无码中文字幕爆| 日韩精品视频一区二区三区| 91精品黄色片免费大全| 97人人模人人爽人人澡| 韩国三级大全久久网站| 91精品国产综合久久精品麻豆| 亚洲欧美久久久久| 国产麻豆一区| 这里只有精品99re| 91亚洲一区二区| 免费观看亚洲视频大全| 日韩视频一区在线观看| 日韩一区二区三免费高清在线观看| 国产精品 日产精品 欧美精品| 成人夜晚看av| 国产女无套免费视频| 韩国三级中文字幕hd久久精品| 国产专区精品视频| 国产情侣av在线| 国产a视频精品免费观看| 国产高清在线一区二区| 人妻与黑人一区二区三区| 国产91富婆露脸刺激对白| 国产日韩一区二区三区| 视频一区二区三区在线看免费看 | 色综合天天综合网国产成人综合天| 男人添女人下面高潮视频| 亚洲风情在线资源| 欧美午夜影院一区| 男生和女生一起差差差视频| 一区二区精彩视频| 日韩精品福利在线| 久操视频免费看| 91精品国产视频| 欧美黑人性视频| 亚洲欧美一区二区三区在线观看| 另类的小说在线视频另类成人小视频在线| 成人做爰www免费看视频网站| 丰满少妇被猛烈进入| 91视视频在线直接观看在线看网页在线看| 欧美精品亚洲| 成人影院在线观看| 99这里只有精品视频| 精品久久久久久久久久ntr影视| 免费观看成人高| 免费av一区二区| 色系网站成人免费| 不卡一区二区在线| 99精品视频在线| 亚洲最大网站| 天天干天天爱天天操| 久久美女免费视频| 青娱乐自拍偷拍| 成人免费视频视频在| 久久这里有精品| 欧美日韩久久久一区| 久久久一区二区三区| 日本不卡视频在线观看| 国产在线天堂www网在线观看| 懂色av懂色av粉嫩av| 欧美成人一区二区在线观看| 日韩欧美手机在线| 粉嫩av一区二区三区免费观看| 乱码一区二区三区| 欧美日韩直播| 欧美美最猛性xxxxxx| av一级在线观看| 成人在线视频首页| 中国成人亚色综合网站| 丝袜美腿诱惑一区二区三区| 99热国内精品| 丝袜美腿一区| av网址在线| 狠狠躁夜夜躁av无码中文幕| 成人性生交大免费看| 亚洲美女性囗交| 永久免费观看片现看| 欧美理论在线播放| 久久久久久久久久婷婷| 国产美女无遮挡永久免费| 亚洲国产精品国自产拍av| 欧美视频第一区| 精品自拍偷拍| 久久久欧美一区二区| www.黄色片| 一区二区三区日韩精品视频| 尤物网站在线看| 国产精品久久天天影视| 国产在线观看精品一区二区三区| av在线免费观看网| 欧美亚洲综合另类| 摸摸摸bbb毛毛毛片| 久久久久99| 欧美日本韩国在线| 欧美xx视频| 国产一区二区激情| 中文字幕 国产| 国产精品丝袜黑色高跟| 三上悠亚av一区二区三区| 精品视频黄色| 国产一区香蕉久久| 国产鲁鲁视频在线观看特色| 日韩限制级电影在线观看| 免费在线一级片| 不卡的av电影| 欧美丰满熟妇xxxxx| av一区二区高清| 国产原创欧美精品| 在线你懂的视频| 亚洲国产成人在线视频| 精品国产午夜福利| 亚洲国产高清aⅴ视频| 日本国产一级片| 欧美福利网址| 久久av一区二区三区亚洲| 成人性生活av| 久久久精品影院| 秋霞视频一区二区| 日本久久精品电影| 日韩av手机在线免费观看| 91国内在线| 国产精品国产三级国产普通话蜜臀 | 中文字幕avav| 亚洲激情网站| 欧美一区二区福利| 亚洲欧美专区| 97精品视频在线| av播放在线| 欧美另类z0zxhd电影| 久热精品在线观看| 久久久国产午夜精品| 一级 黄 色 片一| 亚洲一区激情| 在线日韩av永久免费观看| 成人动态视频| 国产一区二区丝袜| 成人一级福利| 日韩视频中文字幕| 污污视频在线观看网站| 欧美乱熟臀69xxxxxx| 国产亚洲成人av| 国产精品水嫩水嫩| av网站有哪些| 国产麻豆成人精品| 国产成人无码一二三区视频| 天天影视天天精品| 牛人盗摄一区二区三区视频| 亚洲精品午夜| 国产精品igao视频| av在线资源| 欧美成人免费小视频| 二区三区在线| 日韩精品视频免费在线观看| a级片在线播放| 欧美亚洲国产一区二区三区va| 日产欧产va高清| 亚洲欧美一区二区三区孕妇| av黄色在线免费观看| 北条麻妃国产九九精品视频| 午夜啪啪小视频| 三级在线观看一区二区 | 国产精品毛片在线| 日韩久久久久久久久久久久| 成人在线观看免费视频| 欧美一级淫片| 久久影院中文字幕| 免费a在线观看| 久久精品国产99国产精品| 成人在线免费观看视视频| 嗯啊主人调教在线播放视频| 久久久国产一区二区| 99精品老司机免费视频| 国产手机视频精品| 日韩中文字幕综合| 日韩精品一区二区在线| 91亚洲国产成人精品一区| 色哟哟欧美精品| 91国产丝袜播放在线| 亚洲影院久久精品| 亚洲成人生活片| 一区在线观看免费| 成人高h视频在线| 黄色av一区二区| 精品久久久久久久久久久久久久| 久久亚洲国产成人精品性色| 亚洲欧美另类综合偷拍| 男人av资源站| 亚洲天堂2016| 国产67194| 亚洲免费电影在线| 黑鬼狂亚洲人videos| 综合久久久久久| 永久免费看片直接| 亚洲人成精品久久久久久| 精品国产乱码久久久久软件| 在线免费三级电影网站| 午夜伦理精品一区| 激情视频网站在线播放色| 91禁国产网站| 老司机2019福利精品视频导航 | 深夜福利影院在线观看| 国产乱对白刺激视频不卡| 鲁一鲁一鲁一鲁一av| 激情五月激情综合网| 一级日本黄色片| 成人午夜免费av| 日本护士做爰视频| 久久精品一区二区三区不卡牛牛 | 精品久久免费视频| 亚洲精品国产无天堂网2021| 欧美又粗又大又长| 亚洲二区在线观看| 亚洲天堂五月天| 欧美喷潮久久久xxxxx| av免费在线不卡| 亚洲国产欧美一区| 久久久久国产精品嫩草影院| 亚洲品质视频自拍网| 免费在线看黄| 欧美精品国产精品日韩精品| 亚洲天堂av在线| 国产日产久久高清欧美一区| 亚洲成人偷拍| 欧美一级爱爱| 亚洲午夜精品一区二区国产| 久久这里只有精品18| 日韩精品乱码免费| 手机看片国产精品| www国产精品av| www.av免费| 欧美日韩精品在线观看| 中文字字幕在线中文乱码| 91精品国产综合久久精品麻豆| 天堂v在线观看| 色狠狠av一区二区三区香蕉蜜桃| 91短视频版在线观看www免费| 欧美大片欧美激情性色a∨久久| 色网在线免费观看| 成人国产精品日本在线| 麻豆视频一区| 婷婷视频在线播放| 亚洲欧美日本国产专区一区| 久久久久久久久久毛片| 91在线高清观看| 国产性xxxx| 欧洲精品中文字幕| 天天干视频在线| 米奇精品一区二区三区在线观看| jizz内谢中国亚洲jizz| 99porn视频在线| 国产精品xxxx喷水欧美| 久久夜色精品一区| 久草中文在线视频| 欧美日韩中文字幕精品| 亚洲av成人精品日韩在线播放| 久久综合五月天| 91精品国产经典在线观看| 国内精品视频在线播放| 亚洲欧洲中文字幕| 香蕉视频网站入口| av毛片久久久久**hd| 欧美三级小视频| 欧美日韩国产精品自在自线| 你懂得在线网址| 91a在线视频| 91成人精品在线| 佐佐木明希av| 久久精品国产免费看久久精品| 91网站免费视频| 欧美日韩免费一区| 日韩在线观看视频网站| 久热精品在线视频| 91精品国产自产观看在线| 视频一区视频二区视频三区高| 国产精品久久久久久久免费软件 | 国产极品尤物在线| 国产成人在线视频免费播放| 污污的视频在线免费观看| 欧美影院一区二区| 黄色在线观看网| 国产成人在线一区| 精品国产91| 91热这里只有精品| 国产欧美一区二区精品忘忧草| 视频一区二区三区四区五区| 亚洲精品97久久| 中文日产幕无线码一区二区| 精品伦精品一区二区三区视频 | 亚洲日本护士毛茸茸| 国产精品玖玖玖| 日韩在线观看网站| 国产福利91精品一区二区| 在线观看精品视频| 九色|91porny| 欧美三根一起进三p| 精品sm在线观看| 九九精品调教| 国产一区二区久久久| 国产欧美一区二区三区国产幕精品| 少妇精品无码一区二区三区| 欧美日韩激情网| 成人三级黄色免费网站| 国产欧美在线播放| 亚洲91视频| jjzzjjzz欧美69巨大| 欧美日韩国产综合新一区 | 国产亚洲欧美日韩日本| 中文在线最新版天堂| 久久久精品免费| 成人自拍在线| 白嫩少妇丰满一区二区| 欧美极品aⅴ影院| 99在线无码精品入口| 韩国国内大量揄拍精品视频| 综合伊思人在钱三区| av在线无限看| 一区二区三区日韩精品| 天堂资源最新在线| 国产精品天天狠天天看| 你懂的国产精品永久在线| 这里只有精品在线观看视频 | 神马影视一区二区| 亚洲三级在线观看视频| 亚洲国产美国国产综合一区二区| 青青视频在线观| 成人免费xxxxx在线观看| 激情视频一区二区三区| 国产肥白大熟妇bbbb视频| 91精品国产综合久久久久久漫画 | 岛国av一区二区在线在线观看| 国产高清视频在线| 产国精品偷在线| 日韩**一区毛片| 免费在线观看黄色av| 在线观看成人黄色| 中文字幕一区二区三区中文字幕 | 成年人晚上看的视频| 天使萌一区二区三区免费观看| 成人性生活免费看| 欧美人妖巨大在线| 国产精品专区免费|