我正在寻找一种可能超越Dictionary<string, object>
的数据结构。我有一张 N 项目的地图 - 地图构造一次然后多次读取。在程序的生命周期内,地图不会更改(不添加任何新项目,不删除任何项目,也不会重新排序项目)。因为映射不会更改,所以它不需要是线程安全的,即使使用它的应用程序是多线程的。我希望大约50%的查找将发生在不在地图中的项目中。
Dictionary<TKey, TItem>
速度非常快,我最终可能会使用它,但我想知道是否有另一种数据结构对于这种情况更快。虽然该程序的其余部分显然比这个地图更昂贵,但它被用于性能关键部分,我想尽可能加快它。
答案 0 :(得分:3)
您要找的是Perfect Hash Function。您可以根据字符串列表创建一个字符串,然后将其用于字典。
非通用HashTable
有constructor that accepts IHashCodeProvider
,可让您指定自己的哈希函数。我找不到Dictionary
的等效内容,因此您可能不得不求助于使用Hashtable。
您可以在PerfectStringHash
课程内部使用它,它将为您完成所有类型的演员。
请注意,您可能需要能够指定哈希中的桶数。我认为HashTable
只允许您指定加载因子。您可能发现您需要完全滚动自己的哈希。对于每个人来说,这是一个很好的课程,我想,这是一个通用的完美哈希。
编辑:显然有人已经实施了一些Perfect Hash algorithms in C#。
答案 1 :(得分:0)
根据大多数TKey对MSDN的评论,通用字典的读取性能“接近O(1)”(并且只需字符串键即可获得相当好的性能)。而且,您可以从框架中免费获得此功能,而无需实现自己的集合。
http://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.90).aspx
答案 2 :(得分:0)
如果你需要坚持使用字符串键 - 字典至少非常好(如果不是最佳选择)。
当你开始测量时还要注意另一件事 - 考虑哈希本身的计算是否具有可衡量的影响。搜索长字符串应该花费更长的时间来计算哈希值。查看您要搜索的项目是否可以表示为具有常量get hash time的其他对象。