用户得分排名,选择正确的数据结构

时间:2016-04-01 04:27:44

标签: algorithm

我有问题要解决。

我会继续更新用户ID分数。这是一个整数而另一个是长整数。 我需要支持两个动作。

  1. 添加userid-score,并返回排名。 (基于分数)
  2. 根据rand返回用户ID。 (例如输入:3,返回带有id的第3高分)
  3. 我应该选择哪种数据结构? 我想到了BST,插入速度很快。但要获得Kth值并不容易。

2 个答案:

答案 0 :(得分:1)

您可以注释任何树结构,以便每个节点存储该节点下方的后代数,并在修改树结构时对其进行更新。然后,当您想要找到第k个最高分时,从根目录向下导航,使用存储在每个节点下方的后代数来告诉您是向左还是向右分支。

E.g。如果你想找到排名第一的排名第一的玩家,如果根有两个孩子,每个有8个后代,那么就去找一个拥有最大密钥的孩子。

我写了一些东西来支持这样的事情以获得乐趣,我基于https://en.wikipedia.org/wiki/Treap。它具有很高的概率平衡,但需要的代码远远少于AVL或红黑树。

(当然如果您只想检索前N个项目以显示高分表,则根本不需要此项,因为从BST中提取前N个项目相对容易)

答案 1 :(得分:1)

您正在寻找Order statistic tree,因为@mcdowella说它基本上只有Binary search treeB tree,还支持另外两项操作:

Select:找到第i个最小元素

Rank:找到所有元素排序后由相应值给出的元素索引。

使用简单的tree traversal可以轻松实现这些操作。

还有一个内置的GNU C ++实现,你可以在这里阅读更多相关内容:C++ STL: Policy based data structures.