按值对TreeMap进行排序的最佳方式



我的程序需要对TreeMap值进行排序。但数值可以是100000。我计划使用合并排序。计算需要多少汽油/美元?找到N最高数的最佳有效方法是什么?TreeMap按键排序,而不是按值排序。https://docs.rs/near-sdk/2.0.0/near_sdk/collections/struct.TreeMap.html#method.iter_rev

暂时忽略区块链部分。

如果除了键的顺序之外,还需要对值进行排序,则可以使用另一种数据结构,如使用Value和Key元组作为排序键的TreeSet<(Value, Key)>。在更新TreeMap时,也会更新TreeSet。要以相反的顺序迭代值,可以使用TreeSet的反向迭代器。使用一对而不仅仅是一个Value可以消除相同值的歧义,但每个值都有一个相关的Key

现在在NEAR上实现这一点。

由于我们目前没有TreeSet,您可以使用另一个TreeMap<(Value, Key), ()>

按值进行的完全重新排序可能是O(KlogK(操作,其中K-=原始TreeMap中的条目数,我认为大约为100000。

如果我的松散算术是正确的,那么KlogK大约是170万次运算(log100000略小于17(。

如果与K相比,我们正在寻找的条目数量N较小,那么我们可能会做得更好。

伪码:

top N := first N elements from original collection
min value := smallest value of the top N
for each remaining element in original collection:
if element value > min value:
replace corresponding element in top N
min value := smallest value now in top N

所以,这让人通过了原始收藏。假设(挥手(大约一半的时间我们达到"元素值>"最小值"条件,因此必须定位新的最小元素。

每个"定位最小值"都是O(logN(,假设集合已排序。我们这样做了K/2次,所以K/2logN操作总数,加上遍历原始集合的K

让我们把N=10。因此,这是50000 log 10+100000,或约300000,比170万有所改进。

但这在很大程度上取决于N是什么。

最新更新