gpt4 book ai didi

java - 何时使用 TreeMap 而不是 HashMap

转载 作者:行者123 更新时间:2023-12-03 07:53:23 26 4
gpt4 key购买 nike

我需要一个支持 3 种操作的 map :“插入”、“删除”和“按排序顺序迭代”。这正是Java中TreeMap的接口(interface)。话虽如此,它也可以通过使用 HashMap 并在每次迭代之前对其进行排序来实现。为了分析不同的方法,假设我执行 n 插入和 m 删除,'r' 读取然后迭代。

使用 TreeMap 我们有以下实现:

TreeMap<Integer, Integer> tm = Maps.newTreeMap();
for (int i=0;i<n;++i) {tm.put(i, 2*i);} // O(n*log(n))
for (int i=0;i<m;++i) {tm.remove(i);} // O(m*log(m))
for (int i=0;i<r;++i) {tm.get(i);} // O(r*log(n-m))
for (Integer i : tm) {print(i);} // O(n-m)

总而言之,我们的总运行时间为 O(n*log(n) + m*log(m) + r*log(n-m))

使用 HashMap 我们有以下实现:

HashMap<Integer, Integer> hm = Maps.newHashMap();
for (int i=0;i<n;++i) {hm.put(i, 2*i);} // O(n)
for (int i=0;i<m;++i) {hm.remove(i);} // O(m)
for (int i=0;i<r;++i) {hm.get(i);} // O(r)
List<Integer> sortedList = Lists.newArrayList(hm.keySet()); // O(n-m)
Collections.sort(sortedList); // O((n-m)*log(n-m))
for (Integer i : sortedList) {print(i);} // O(n-m)

总而言之,我们的总运行时间为 O((n-m)*log(n-m))

对于所有n,m O(n*log(n) + m*log(m) + r*log(n-m)) > O((n-m)*log(n-m))

因此,我的问题是,TreeMapHashMap 更好的用例是什么?如果您需要多次迭代 map (比如说 k)次(在这种情况下,如果 k 是 >> log(n) TreeMap 的运行时间为 O(k*(n-m))HashMap 的运行时间为 O( k*(n-m)*log(n-m)))?无论如何,如果您只执行 O(log(n)) 迭代(这听起来确实像一个理智的用例),HashMap 将优于 TreeMap。我错过了什么吗?

最佳答案

当然存在这样的用例。在所有读取繁重的设置中,您具有在插入期间仅排序一次的优势。大多数用例阅读量很大,这与您问题的假设相反。

TreeMap 提供了更大的优势,当您需要提取具有上界或下界键的子图、查找最小或最大键或查找最接近给定键的键时. NavigableMap 接口(interface)专门用于这些操作。

关于java - 何时使用 TreeMap 而不是 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28300901/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com