【问题标题】:Sort java HashMap by values using O(n log n) complexity使用 O(n log n) 复杂度按值对 java HashMap 进行排序
【发布时间】:2012-05-22 23:14:25
【问题描述】:

我知道这个问题已经被问过很多次了。但几乎所有的解决方案都有 O(n^2) 的计算复杂度。

我正在寻找复杂度为 O(n log n) 的解决方案。有人可以推荐吗?

非常感谢, 柴坦亚

【问题讨论】:

  • 可能重复 stackoverflow.com/questions/109383/… 答案是 O(n) 复杂度
  • 为什么不使用 TreeMap?编辑 - 这也是 noMAD 链接的问题中的建议。
  • @noMAD 链接的问题的答案有几个严重的缺陷(如该答案的 cmets 中所建议的那样)。特别是,如果多个键映射到同一个值,事情就会中断。如果您对不在源映射中的键调用map.get(key),您将获得几乎不可预测的异常,并带有令人困惑的堆栈跟踪。那个解决方案O(n)怎么样?
  • 此外,如果支持映射更改值,TreeMap 可能会损坏,因此当您调用 get 时,entrySet 中出现的条目将不会出现。啊。我见过太多人尝试TreeMap 方法,但后来却受到伤害。请避免它。
  • “几乎所有解决方案的计算复杂度都为 O(n^2)”是什么意思?所有最常见的排序算法都有复杂度 O(N log(N))。除非您听说过的唯一解决方案是冒泡排序,否则您应该在完成 CS101 作业后立即忘记它。

标签: java collections hashmap


【解决方案1】:

将条目复制到List,按值对List进行排序;复制回LinkedHashMap。我认为甚至不可能有更好的解决方案。

List<Entry<K, V>> entries = new ArrayList<Entry<K, V>>(map.entrySet());
Collections.sort(entries, new Comparator<Entry<K, V>>() {
  public int compare(Entry<K, V> left, Entry<K, V> right) {
    return left.getValue().compareTo(right.getValue());
  }
}
Map<K, V> sortedMap = new LinkedHashMap<K, V>(entries.size());
for (Entry<K, V> entry : entries) {
  sortedMap.put(entry.getKey(), entry.getValue());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多