【问题标题】:Best way to sort the TreeMap by values按值对 TreeMap 进行排序的最佳方法
【发布时间】:2021-01-04 07:47:49
【问题描述】:

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

【问题讨论】:

  • “dollars”和“gas”与数据结构有什么关系?
  • 在区块链中,计算复杂性会消耗gas。
  • 你在说谜语。您如何确定计算所消耗的石油产品量?
  • 这是我的代码,Evgeny gateway.ipfs.io/ipfs/…提出了解决方案

标签: nearprotocol


【解决方案1】:

暂时忽略区块链部分。

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

现在在 NEAR 上实现它。

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

【讨论】:

    【解决方案2】:

    完整的按值重新排序可能是 O(K log K) 操作,其中 K = 条目数在原始的 TreeMap 中,我认为它被描述为大约 100,000。

    所以 K log K 大约是 170 万次操作(log 100,000 略小于 17),如果我的松散算术是正确的。

    如果我们要查找的条目数 NK 相比要小,那么我们可能会做得更好。

    伪代码:

     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 记录了总共 N 次操作,加上 K用于遍历原始集合。

    让我们把 N = 10。所以这是 50,000 log 10 + 100,000,或大约 300,000,比 170 万有所改进。

    但这种方法的可行性很大程度上取决于 N 是什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 2011-11-22
      • 2021-08-28
      相关资源
      最近更新 更多