如何提高结构对象作为键的哈希表的查找速度
2009/07/13 17:10
- wanghaining
- 阅读 : 81
- 评论 : 0
- 推荐 : 0
- 抓走 : 0
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是唯一的,因此能增强查找的性能。