我有一个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/