【问题标题】:Algorithm to find weighted ranking?找到加权排名的算法?
【发布时间】:2022-01-24 04:27:08
【问题描述】:

我想根据不同的参数找到一个人的排名,每个参数都有不同的权重。

例如假设如果有 a、b 和 c 三个项目,这些项目的值可以在 0 到 10,00,000 之间。分配给它们的权重 a = 0.3,b=0.2,c=0.1。假设有 10,000 人拥有这些不同数量的物品。假设一个人 X 有物品 a=2200, b = 4000, c= 1280。那么我怎么能找到人 x 在他所在的 10,000 人中的排名。

如果需要更多详细信息,请告诉我。

感谢您的即时帮助。

【问题讨论】:

  • 你最终还是需要所有的行列吗?还是只需要少数人的排名?
  • @TomerW 我需要算法才能找到任何人的排名。
  • 如果你最终需要所有等级,只需循环它们并计算 People.Foreach(p: R = AwA+BwB+C*wC)
  • @TomerW 是对的,但是人数可以扩展到任何数字,因此循环它们会降低性能,所以我想如何找到随机选择的人的排名。
  • 首先,计算所有人的权重值,并将其存储在一个数组中。然后对数组进行排序。现在你有一个根据体重排序的人的排名列表。现在对于每个随机查询计算人的权重,然后使用二进制搜索从排序数组中找到权重的上限位置,上限位置是该人的排名。这里预处理需要O(n) 次,每个查询需要O(logN) 次。

标签: algorithm performance sorting ranking weighted


【解决方案1】:

首先,计算所有人的加权点数。 也就是说,

P[i] = Wa * a[i] + Wb * b[i] + Wc * c[i];

然后按其值对所有P[i] 进行排序。

您可以定义和使用自定义比较功能轻松获得排名。

    for (int i = 0; i < n; i++) rank[i] = i;
    sort (rank, rank + n, [P](int i, int j) {
        return P[i] < P[j];
    });

在动态插入和获取排名操作的情况下,您必须使用order-statistics tree。 然后就可以得到O(logn)这两个操作的性能结果了。

请参考codeforcesarticle了解更多详情。

【讨论】:

  • 感谢您的回复,但循环遍历所有人会减慢我想对任何随机人进行排名的性能。
  • @ksanjay,所以你的意思是人的动态成瘾并获得随机人的排名?
  • 是的,你是对的
  • 我对我的答案进行了编辑,这就是你想要的吗?
  • 让我检查一下...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 2012-11-16
  • 2013-06-06
  • 1970-01-01
相关资源
最近更新 更多