如何提高结构对象作为键的哈希表的查找速度

2009/07/13 17:10


http://www.oobang.com/myNote/310 复制链接

RSS来源 : 译言-每日精品译文推荐 | imqiang  去看原文章

译者:imqiang

当使用结构对象作为哈希表的键时,哈希表的查找操作的性能糟透了。这要“归功于”内部所使用的用来查找的方法GetHashCode()。

如果一个结构只是包含简单的值类型(int, short等), 计算GetHashCode的算法创建的大多数哈希值会被放入同一个bucket里。

举个例子,哈希表创建10个buckets,那么很可能,所有的键都会被放到同一个bucket。因此,当进行查找的时候,.NET运行时就得遍历整个bucket来获取值。

BUCKET1 - Value1, Value2, Value3,...,valuen
BUCKET2 - (empty)
BUCKET3 - (empty)
BUCKET4 - (empty)
BUCKET5 - (empty)
BUCKET6 - (empty)
BUCKET7 - (empty)
BUCKET8 - (empty)
BUCKET9 - (empty)
BUCKET10- (empty)

因此,平均来说,查找操作的时间复杂度从O(1)变成了O(n) 。

为了克服这一点,可以考虑重写GetHashCode()方法。

一种方法是创建一个字符串,然后把结构中所有的值类型都合并起来,并用某个特殊的字符作为分隔符。

因为你的结构是个查询条件,能确保所有的结构的值是不同的,因此能保证产生的字符串是唯一的。

产生的字符串有一个GetHashCode()方法,因为它继承自System.Object(像其他的对象一样),仅仅返回这个API的输出就好了。代码实例理解起来容易些:

struct
{
int a;
short b;
public struct(int _a, short _b)
{
a = _a;
b = _b;
}
public override int GetHashCode()
{
string hash = a.ToString() + ":" b.ToString();
return hash.GetHashCode();
}

显示的生产hashcode,可以保证hashcode是唯一的,因此能增强查找的性能。

参考: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemobjectclassgethashcodetopic.asp

原文地址:https://www.cnblogs.com/dongzhiquan/p/1932447.html