我的程序需要对 TreeMap 值进行排序。但值可以是 100,000。我打算为此使用合并排序。计算需要多少汽油/美元?找到 N 最高数的最佳和有效方法是什么?TreeMap 按键排序而不是按值排序。 https://docs.rs/near-sdk/2.0.0/near_sdk/collections/struct.TreeMap.html#method.iter_rev
2 回答
暂时忽略区块链部分。
如果除了键的顺序之外还需要对值进行排序,则可以使用另一种数据结构,例如TreeSet<(Value, Key)>
使用 Value 和 Key 的元组作为排序键。更新 aTreeMap
时,您也会更新TreeSet
. 要以相反的顺序迭代值,您可以使用TreeSet
. 拥有一对而不仅仅是 a可以让您消除相同的值的歧义,但也可以为每个值Value
关联一个。Key
现在在 NEAR 上实现这个。
由于我们目前没有TreeSet
,您可以使用另一个TreeMap<(Value, Key), ()>
一个完整的按值重新排序可能是一个 O( K log K ) 操作,其中K = 原始 TreeMap 中的条目数,我认为它被表述为大约 100,000。
所以 K log K大约是 170 万次操作(log 100,000 略小于 17),如果我的松散算术是正确的。
如果我们要查找的条目数N与K相比较小,那么我们可能会做得更好。
伪代码:
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(log N )。我们这样做了K /2 次,所以总共有K /2 log N次操作,加上遍历原始集合的K。
让我们把N = 10。所以这是 50,000 log 10 + 100,000,或大约 300,000,比 170 万有所改进。
但这在很大程度上取决于N是什么。