2011-03-24 52 views
4

我正在尋找使用創建和維護內存中的排名。根據分數對用戶排序的數據結構的建議

根據得分計算與用戶ID和等級相關的得分。應支持以下功能。

  • 根據分數升序或降序排列排序。插入或刪除O(log n)時間。
  • 給定一個用戶ID,查找用戶的排名/分數以及在O(log n)時間的n個前後排名。例如。獲得用戶8347名次,前後5名。
  • 從任意偏移量x中檢索n個等級。例如。從800開始獲得100個等級

鑑於這些要求,有沒有關於哪些數據結構最適合這些要求的建議?

回答

7

我想你可以非常有效地使用訂單統計樹和散列表的組合。

訂單統計樹是一個增強二叉搜索樹,除了按排序順序存儲元素外,還允許通過樹中的索引查找元素。也就是說,該結構支持O(lg n)插入,刪除和按鍵查找值,以及O(lg n)查找給定其索引的元素。如果將分數存儲在此結構中,則可以輕鬆插入或更新新分數,並跟蹤樹中每個元素的排名。

爲了將用戶與他們的分數相關聯,您可以將此結構與從用戶ID映射到持有該用戶分數的順序統計樹中的節點的輔助哈希表映射。除了O(lg n)分數排名的查找之外,這會給你O(1)個玩家的分數。

希望這會有所幫助!

+0

謝謝您的建議。我傾向於使用紅黑樹,它保存着孩子的數量(因此也是排名),但是在插入和刪除RB樹時(特別是在旋轉時)似乎存在一些併發問題。 – smahesh 2011-03-24 16:31:53

+0

我沒有unserstand是否有方法來更新用戶使用順序統計樹的排名? – 2018-01-25 10:37:41

0

使用內存中的SQLite數據庫。

0

優先隊列怎麼樣?

每個人都會有一個分數,把它扔到優先級隊列中,然後它會按升序/降序優先級/值/等級/等級進行排序。