Performance 如何计算按更改值排序的键/值元素排序列表中每个元素的百分比

Performance 如何计算按更改值排序的键/值元素排序列表中每个元素的百分比,performance,algorithm,sorting,data-structures,key-value,Performance,Algorithm,Sorting,Data Structures,Key Value,我查看了以下示例帖子(在众多帖子中),不幸的是,没有一篇符合我的要求: 下面是问题的描述 我们有一个键/值元素列表(我现在不想使用术语“dictionary”),按值排序,其中任何给定元素的“值”都可以随时更改,并且经常更改。一旦任何给定值发生变化,我们需要再次按值对元素列表进行排序。重新排序完成后,我们需要通过键知道列表中每个元素的索引,以计算每个元素的百分比 换句话说,我们需要计算一个大的排序(按值)关键/值元素列表中每个元素的百分位数,其中值变化很快 显然有一种“天真”的方法可以做

我查看了以下示例帖子(在众多帖子中),不幸的是,没有一篇符合我的要求:

下面是问题的描述

我们有一个键/值元素列表(我现在不想使用术语“dictionary”),按值排序,其中任何给定元素的“值”都可以随时更改,并且经常更改。一旦任何给定值发生变化,我们需要再次按值对元素列表进行排序。重新排序完成后,我们需要通过键知道列表中每个元素的索引,以计算每个元素的百分比

换句话说,我们需要计算一个大的排序(按值)关键/值元素列表中每个元素的百分位数,其中值变化很快

显然有一种“天真”的方法可以做到这一点,但是,考虑到值的变化数量、大量的键/值对、重新排序以及每次计算百分位数,这将不起作用


有没有人有一个非常快速的算法(或启发式算法)可以做到这一点?

一种方法是使用哈希表+平衡顺序统计树

哈希表获取键,并映射到树的一个节点


树可以在O(logn)时间内完成更改值、获取节点排名等操作。

当元素更改时,您不必对整个列表进行排序,只需将该元素重新定位到新位置即可。百分位仅在元素的新旧位置之间变化。您查看过优先级队列数据结构吗?并且百分位都以固定数量变化:
1/N
,其中N是元素的总数。除了与旧值或新值绑定的元素。我不确定这里的百分位数是什么意思。如果列表中有100个项目,按值排序,那么第10个项目的百分比是否等于10?如果我更改值并重新排序,使项目现在位于位置52,百分比是否等于52?@JimMischel,Jim,这是正确的。对我们来说,百分位数是排序位置的简单函数。