暴露的API是基于字节[]的事实不应该必然指示您的缓存的内部细节。
第二个观察结果是,这不是一个广义的数据结构问题。所有机场的空间和所有城市的空间都是有限的,众所周知的。 (你甚至知道尺寸)。
散列图,树等都是保证一定性能特征的算法一般用法。
由于数据的完整性是一个非问题(“数据不会更改”),如果空间的考虑并不重要(“尽可能快地”),那么为什么不:
[编辑:该位不知何故切失去了在剪切和粘贴:你的索引(号)你们的城市和机场,因为你知道这些集合,它们实际是静态]
// these need to get initialized on startup
// this initialization can be optimized.
Map<byte[], Long> airportIndexes = new HashMap<byte[], Long>(NUMBER_OF_AIRPORTS);
Map<byte[], Long> citiesIndexes = new HashMap<byte[], Long>(NUMBER_OF_CITIES);
Map<Long, byte[]> airports = new HashMap<Long, byte[]>(NUMBER_OF_AIRPORTS);
Map<Long, byte[]> cities = new HashMap<Long, byte[]>(NUMBER_OF_CITIES);
long[][] airportToCitiesMappings = new byte[NUMBER_OF_AIRPORTS][];
long[][] citiesToAirportMappings = new byte[NUMBER_OF_CITIES][];
public List<byte[]> getCitiesNearAirport(byte[] airportName) {
Long[] cityIndexes = getCitiesByIdxNearAirport(airportName);
List<byte[]> cities = new ArrayList<byte[]>(cityIndexes.length);
for(Long cityIdx : cityIndexes) {
cities.add(cities.get(cityIdx));
}
return cities;
}
public long[] getCitiesByIdxNearAirport(Long airportIdx) {
return airportToCitiesMappings[airportIdx];
}
public long[] getCitiesNearAirport(byte[] airportName) {
return getCitiesNearAirport(airportIndexes.get(airportName));
}
public long[] getCitiesNearAirport(Long airportIdx) {
return airportToCitiesMappings[airportIdx];
}
// .. repeat above pattern for airports.
这应该给你O(1)时间的性能特点。 。在空间方面有相当多的冗余。
放纵我:为什么frig使用'byte []'来代表城市和机场? – gustafc 2009-12-04 08:44:14
:)嗯。我们有另一个使用字节[](编码机场)作为关键机场信息的缓存。这样做是为了节省空间和加快访问速度。该缓存的问题在于其基于机场。我们现在要支持城市。如何,我们不想在缓存中创建更多关卡(城市 - >机场 - >其他信息 - >更多信息),因为它已经有3-4个关卡。因此,我们正在创建这个新缓存,该缓存将用于获取给定城市/机场的机场,并使用结果查询现有的基于机场的缓存。 嗯,我是模糊的吗? :) – 2009-12-04 11:06:01
嗯没有人的答案? 我正在努力解决问题。会让你知道tomm的结果。 如果您有任何问题,请提出一些更好的建议。 – 2009-12-05 03:19:23