找到加权排名的算法?
Posted
技术标签:
【中文标题】找到加权排名的算法?【英文标题】: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)
次。
【参考方案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)
这两个操作的性能结果了。
请参考codeforces和article了解更多详情。
【讨论】:
感谢您的回复,但循环遍历所有人会减慢我想对任何随机人进行排名的性能。 @ksanjay,所以你的意思是人的动态成瘾并获得随机人的排名? 是的,你是对的 我对我的答案进行了编辑,这就是你想要的吗? 让我检查一下...以上是关于找到加权排名的算法?的主要内容,如果未能解决你的问题,请参考以下文章