我需要一个Map<Integer,String>
,主要需要key
快速检索值。但是,我还需要检索其键在范围(n1到n2)内的所有条目(List
,key
对)的value
。但是,列表中不需要排序。
该地图至少会有10,000个此类条目。
我最初想过使用TreeMap
,但这对于更快的检索(get()操作的O(log n))没有帮助。是否可以从HashMap获取其键在n1到n2范围内的条目列表?
最好的选择是什么?
答案 0 :(得分:3)
NavigableMap
的两个实现(允许您根据键范围检索子映射或子集)是TreeMap
和ConcurrentSkipListMap
,两者都提供O(log n)访问时间。
假设您按照常规HashMap
要求O(1)访问时间,我建议您实施自己的(低效)“键范围”方法。换句话说,牺牲键范围操作的性能,以改善您使用常规HashMap
实现的访问时间。除此之外没有其他方法:NavigableMap
方法本质上依赖于以排序方式存储的数据,这意味着您永远无法实现O(1)访问时间。
答案 1 :(得分:0)
密钥的分布有多近?对于10000个元素,平均分布超过20 000种可能性,如0到19999,我可以想象搜索4到14的元素可能没问题。你会错过50%的比率。
我想知道为什么TreeMap没有帮助更快的检索(get()操作的O(log n))?
如果你有Tree,左边的值较小,右边的值较大,你可以返回子树的大部分。需要它是地图和列表吗?