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

Data structures 内存中查找表的最佳数据结构是什么?,data-structures,dictionary,lookup,Data Structures,Dictionary,Lookup,我需要将查找表作为实例成员存储在我的一个类中。构造对象时,表将被初始化。每个“行”将有3个“列”: 我想选择通过StringKey或EnumKey进行查找时产生最佳性能的数据结构 对于同一个字典值有两个键有点尴尬。我以前从未遇到过这种情况,所以我想知道这类事情的标准是什么 我可以创建一个键/值/值结构,而不是键/键/值,但我想知道这会对性能产生什么样的影响 我想这一切都错了吗?嗯。。。“错”是一种严厉的说法。我认为,因为最常见的字典是“单键到值”,并且大量的工作都是为了提供有效的数据结构(映射)

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

我想选择通过StringKey或EnumKey进行查找时产生最佳性能的数据结构

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

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

我想这一切都错了吗?

嗯。。。“错”是一种严厉的说法。我认为,因为最常见的字典是“单键到值”,并且大量的工作都是为了提供有效的数据结构(映射),所以通常最好只使用其中的两个,如果可能的话,为值共享内存。

您有两个哈希映射

  • 一个从StringKey到value

  • 一个从EnumKey到value

您不必复制所有的值实例,这些对象可以在两个HashMap之间共享


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

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

如果有某种方法可以在枚举值和字符串键之间进行映射,则只需使用一种类型的查找表即可完成该操作。

LINQ的ILookup(TKey,TElement)界面可能会有所帮助。假设你的字典是这样的:

Dictionary<carKey, carValue> cars;
字典车;
您可以使用:

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

(…事实上,我认为我可能有点误解了这个问题-但是ILookUp可能仍然适合,但是键/值集可能需要是键和枚举。)

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

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

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

您可以让您的枚举实现一个toKey()方法来返回它们的字符串键,或者让另一个字典将枚举值映射到对应的字符串。

OK-因此在我的示例中,“值实例”只是字符串。我将创建两个字典(一个带有StringKey,一个带有EnumKey),它们的值包含相同的字符串引用变量。听起来对吗?没错。在Python中,这就是它的全部内容。在Java中,有一个string.intern(),它确保所有intern()的字符串都减少到一个公共字符串池中,从而消除一些可能的冗余。我使用的是C#…你知道当我将字符串添加到每个字典时.NET是否会复制该字符串吗?请为每个字典添加一个引用。字符串只存在一次。对一个字符串的多次引用。明白了。字典有自己对字符串的引用,但它们都指向同一个字符串对象。字符串s=“乔”;dct1.添加(“键”,s);——即使正在传递的参数被称为s,dct1.Add也会得到它自己对“joe”的引用。谢谢
public Value getValue(String key)
{
    dictionary.get(key); // normal way
}

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