Это решение совсем другое - очень старомодное, но приближающееся к 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;
Затем используйте эффективную кратко-байтовую карту (от fastutil или gnu 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;
}
Я могу опубликовать оставшуюся часть непроверенного кода, если хотите.