找到加权排名的算法?
Algorithm to find weighted ranking?
我想根据不同的参数找出一个人的排名,每个参数分配给它们的权重不同。
例如假设如果有 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。那么我怎么能找到他所在的10,000人中的人x的排名
如果需要更多详细信息,请告诉我。
感谢即时帮助。
首先,计算所有人的加权分数。
即,
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 and this article。
我想根据不同的参数找出一个人的排名,每个参数分配给它们的权重不同。
例如假设如果有 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。那么我怎么能找到他所在的10,000人中的人x的排名
如果需要更多详细信息,请告诉我。
感谢即时帮助。
首先,计算所有人的加权分数。 即,
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 and this article。