我有一个TreeMultimap<Integer, String>,它也包含重复的键。


  我想获取并显示位于特定键中的键值对
  范围,时间复杂度为O(logN + m),其中N是键值对的总数,m是给定范围内的键值对的数量。


我正在考虑通过使用其方法asMap()将TreeMultimap转换为SortedMap,然后在所需范围内创建一个子图。

SortedMap<Integer, Collection<String>> sortedMap = mapList.getTmm().asMap();
return sortedMap.subMap(beg,end);


但是,使用asMap()方法是否有效?如何显示具有给定时间复杂度的Collection类对象中的每个键值对。

还是应该完全改变我的方法?请帮忙。

最佳答案

TreeMultimap.asMap()在O(1)时间内返回一个在底层结构上运行的视图(因此,效率与直接使用Multimap大致一样)。 NavigableMap.subMap()同样返回其基础结构的视图。该视图不是O(1),因为它必须在较大的地图中进行一些搜索,但是它并不比手动查找第一个元素然后进行迭代要糟糕。

因此,由于间接的两层,会产生一些开销,但是从本质上讲,您应该期望与直接在原始数据结构上进行操作具有相同的性能。由于TreeMultimap由树支持,因此诸如get和put之类的常见操作将为O(log n),而迭代为O(n)。

所有这些都意味着对someTreeMultimap.asMap().subMap(...)返回的映射进行迭代将是O(log n)+ O(n)(因此,线性),因为子映射操作必须搜索第一个有效条目-从那里进行迭代直到到达最后一个有效条目为止。遍历从entrySet()返回的映射的subMap()应该没有任何麻烦。

关于java - 创建 Guava TreeMultimap的子图及其键值对的有效迭代,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40298986/

10-10 12:30