此内存中查找表的最佳数据结构是什么?

时间:2009-03-13 15:23:25

标签: data-structures dictionary lookup

我需要将查找表存储为我的一个类中的实例成员。构造对象时将初始化该表。每个“行”将有3个“列”:

StringKey (e.g., "car")
EnumKey (e.g., LookupKeys.Car)
Value (e.g, "Ths is a car.")

我想选择能够通过StringKey EnumKey进行查找的最佳性能的数据结构。

对于相同的字典值,有两个键很尴尬。我以前从未遇到过这种情况,所以我想知道这类事情的标准是什么。

我可以创建一个Key / Value / Value结构,而不是Key / Key / Value,但我想知道会产生什么样的性能影响。

我是否认为这一切都错了?

5 个答案:

答案 0 :(得分:5)

嗯......“错误”是一种苛刻的方式。我认为,因为最常见的字典是“单值键值”,并且为此提供了有效的数据结构(映射),所以通常最好只使用其中的两个,共享内存以获取值。尽可能。

答案 1 :(得分:4)

你有两个哈希图。

  • 从StringKey到值。

  • 一个从EnumKey到价值。

您不必复制所有Value实例,这些对象可以在两个哈希映射之间共享。

如果有很多项,您可能需要使用两个树图而不是两个哈希图。但基本原则(“分享价值观”)适用于两种结构。一组带有两个地图的值。

答案 2 :(得分:1)

是否真的有必要使用两种类型的密钥键入相同的结构?您可能不需要自己重建复杂的数据结构。您可以为查找表执行某种封装,这样如果内存不是问题,您确实有两个查找表。您可以使用此封装结构来模拟能够使用任一类型的键从“相同”结构中提取值。

OR

如果有一些方法可以在枚举值和字符串键之间进行映射,那么只需要一种查找表即可进入该路由。

答案 3 :(得分:0)

LINQ的ILookup(TKey,TElement)接口可能有所帮助。假设你的词典是这样的:

Dictionary<carKey, carValue> cars;

您可以使用:

ILookUp<carValue, carKey> lookup = cars.ToLookup(x => x.Value, x => x.Key);

(...实际上我认为我可能会略微误读这个问题 - 但ILookUp可能仍然适合该法案,但键/值集可能需要是密钥和枚举。)

答案 4 :(得分:0)

如果两种类型的密钥都保证可以访问每个值,则另一种想法是将一种类型的密钥转换为另一种密钥。例如:

public Value getValue(String key)
{
    dictionary.get(key); // normal way
}

public Value getValue(Enum enumKey)
{
    String realKey = toKey(enumKey);
    getValue(realKey); // use String key
}

你可以让你的Enum实现一个返回其String键的toKey()方法,或者可能有另一个将Enum值映射到String对应的字典。

相关问题