是否有一种优化*具有相同值的*序列*的映射?

时间:2011-07-09 20:37:00

标签: java data-structures map

如果要将Java短片映射到一些不可变对象,并且通常情况是连续的短键序列(邻居)映射到相同的值,那么它会有一些映射结构允许您节省更多内存一个hashmap,同时保持快速访问速度(O(1)或O(log(N)))?

我可以反转地图,我会使用更少的内存,但是我必须通过每个映射来知道是否映射了特定的短路,以及映射的是什么(O(N))。 / p>

我想某种树形图可以做到这一点;也许某些收藏库里有类似的东西?

4 个答案:

答案 0 :(得分:2)

我曾经使用TreeMap一个自定义键类和相应的比较器来实现它。我的密钥类包含一系列double值的两端。查询被指定为一个范围,两端都是相同的,比较器完成其余的工作。

但是有几个选择:

  • 应该如何处理remove()

  • 如果get()的密钥范围与两个或多个范围重叠,会发生什么情况?

  • 将此行为捆绑在新的Map实现中是否有意义 - 可能是TreeMap的子类?

答案 1 :(得分:2)

查看interval trees

答案 2 :(得分:1)

对于映射到相同值的每个短路间隔,您可以使用带有一个条目的二叉树。 密钥是间隔的开始,而数据是间隔的长度加上映射的对象。

因此,要查找是否映射了给定的short,您需要在树中定位节点,其中最高密钥小于给定的密钥(O(logn))并检查给定的密钥是否在此节点表示的间隔内。

答案 3 :(得分:1)

这个解决方案非常不同 - 非常老式,但接近O(1),小而快。 90%的值将适合4位,而地图或树条目需要数百位来表示(没有大量自定义重新实现)。因此,首先将它们表示为4位条目数组:

// Used to store nybbles containing small values, with direct arithmetic mapping.
// A value of 15 indicates that the value is larger than 14.
// Size: 32KB
byte[] zeroTo14Array = new byte[(1<<Short.SIZE)/2];
static final short BIGGER_THAN_NYBBLE = 15;

然后使用有效的短字节映射(来自fastutilgnu trove来表示15到255之间的值:

// Use to store bytes with values 15-255.
// If value is 0, value is larger than 255.
Short2ByteOpenHashMap byteMap = new Short2ByteOpenHashMap();

最后,为其他一切使用有效的短对象地图:

// Use to store values larger than 255 
Short2ObjectOpenHashMap<Value> objectMap = new Short2ObjectOpenHashMap();

// just a sketch
public class Value
{
    short shortValue;
    String optional;
}

如果您愿意,我可以发布剩余的未经测试的代码。