【问题标题】:How to get the top M values from a Map?如何从地图中获取前 M 值?
【发布时间】:2020-07-30 16:16:57
【问题描述】:

所以我正在编写这个程序,它计算关于 Collat​​z 猜想的不同事物。 所以基本上对于一个数字,我计算一个循环及其长度,如下所示:

对于 8:[8、4、2、1] 长度:4

现在我想计算到 1000。

而且对于每个数字,循环的长度都是不同的。

例如,数字 43 的循环长度可以大于 45 的循环长度。

我想按升序获得最大的长度。

Like this:
Number    1 2 3 6 7 9 1825 27 54 73 97 129 171 231 313 327 649 703 871
Length(N) 0 1 7 8 16 19 20 23 111 112 115 118 121 124 127 130 143 144 170 178

我将数字放在HashMap中,数字作为键,长度作为值。

现在我不知道如何按升序获得最大长度。

有什么功能可以帮助我解决这个问题吗? 我必须使用循环和更多列表吗?

Collections.Max 没有任何帮助,因为它只获得一个值,但我需要多个值。

【问题讨论】:

  • 也许将数字放在HashMap中,长度为键,数字为值?

标签: java collections hashmap max cycle


【解决方案1】:

您应该使用任何排序算法(例如合并),然后从排序后的地图中选择您希望获得的数量。

【讨论】:

    【解决方案2】:

    这实际上相当于对由地图值组成的列表进行排序。

    返回 Map 的前 m 个值,升序:

    public static List<Integer> topMValuesAscending(Map<?, Integer> map, int m){
      final List<Integer> values = new ArrayList<Integer>(map.values());
      Collections.sort(values);
      final int valuesCount = values.size();
    
      return values.subList(valuesCount - m, valuesCount);
    }
    

    我相信这是最优的,并且是 O[s*Log(s)] 对数线性的,其中 s 是地图的大小。

    【讨论】:

      猜你喜欢
      • 2012-05-28
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      相关资源
      最近更新 更多