zoukankan      html  css  js  c++  java
  • 如何提高结构对象作为键的哈希表的查找速度

    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

  • 相关阅读:
    1月10日 TextView
    1月9日 布局2
    30 Adapter适配器
    29 个人通讯录列表(一)
    28 ListView控件
    27 登录模板
    26 Activity的启动模式
    25 Activity的生命周期
    24 得到Activity返回的数据
    23 Activity的传值2(bundle)
  • 原文地址:https://www.cnblogs.com/dongzhiquan/p/1932447.html
Copyright © 2011-2022 走看看