找到加权排名的算法?

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,所以你的意思是人的动态成瘾并获得随机人的排名? 是的,你是对的 我对我的答案进行了编辑,这就是你想要的吗? 让我检查一下...

以上是关于找到加权排名的算法?的主要内容,如果未能解决你的问题,请参考以下文章

搜索引擎对SEO优化工作排名算法及影响因素的现状分析

文件内容排名算法,输入排名函数,返回排名后的文件名

最优商品topk排名算法

计算并列排名的算法

啥是佩奇排名算法

手撸golang 基本数据结构与算法 网页排名/PageRank,随机游走