繁体   English   中英

在C#中使用哈希

[英]Using Hash in C#

我有很多东西。 我应该对他们的成员之一进行评估。 首先是一个一个地评估它们-------->伪代码

while (anyObjectExists)
{
      Class1 obj = getObject();
      double evalNum = eval(obj.member1);
}

但是评估是一种费时的方法。 并且许多对象具有相同的member1。 member1是sbyte类型的数组。 所以我试图用另一种方式。 那是我的方式:------->伪代码

HashTable evaluatedObject = new HashTable();
while(anyObjectExists)
{
      Class1 obj = getObject();
      if (evaluatedObjects.Contain(obj))
      {
            double evalNum = evaluatedObjects[obj];
      }
      else
      {
            double evalNum = eval(obj.member1);
            evaluatedObjects.Add(obj, evalNum);
      }
}

我知道我应该重写sbyte的getHashCode和Equals方法。 如您所见,eval方法仅使用Class1中的member1。 所以我以这种方式将方法添加到Class1中

    public override int GetHashCode()
    {
        return 1;
    } 
    public override bool Equals(Object compareState)
    {
        if (!this.member1.SequenceEqual(((Class1)compareState).member1))
            return false;
        return true;
    }

好。 我以为做完了。 但是,当我运行程序时……这真是该死的慢程序。 它比第一个程序慢很多。 我测试了 它可以找到添加的对象。 这没有错。 但这非常非常慢。 我虽然可以用1或2张照片来获取数据。 我怎么了

任何帮助将受到高度欢迎。

您应该返回一个有效的哈希码,例如this.member1.Count().GetHashCode()而不是1 ,在您的情况下,它始终按哈希将它们进行比较,并且因为它们相同,所以按相等将它们进行比较,因此您的函数运行缓慢。

编辑:另外,我认为您的eval功能比序列相等的工作要快。 实际上,您的(Class1)compareState很耗时,序列比较也很耗时。

不要将HashCode固定为1,因为对于依赖散列的数据结构来处理大量冲突,它将变得必要。 在这种情况下,使用哈希表或链接列表没有区别。 搜索对象时(例如,通过调用Cointains方法),有必要评估集合中的每个对象(复杂度为O(N)),而不是通过其哈希码(复杂度为O(1))访问该对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM