2011-01-08 118 views
0

我有很多对象。我应该评估一名他们的成员。他们一个接一个。首先是逐一评估-------->伪代码在C中使用哈希#

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

但是eval是一个耗时的方法。并且很多对象具有相同的成员1。 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); 
     } 
} 

我知道我应该重写getHashCode和Equals方法的sbyte。正如你所看到的,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镜头的数据。我错了什么?

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

+1

我认为它是`evaluateObjects.Contain(obj)`语句导致你的代码放缓。你的所有对象都有相同的密钥(相同的散列码),使你的散列表与链接列表相同。在这种情况下,您的搜索将具有O(N)而不是O(1)的复杂性。 – 2011-01-08 14:13:55

+0

是的。 \ o /那是对的。但是,我怎样才能改变一个sbyte数组的getHashCode方法来为一个数组返回相同的值,它的克隆版本呢? – Masoud 2011-01-08 14:35:06

回答

2

您应该返回一个有效的散列码,如this.member1.Count().GetHashCode()1,在你的情况下,它总是由他们的哈希比较,并因为它们是由相同的平等对它们进行比较,和你的函数运行速度较慢。

编辑:另外我认为你的eval函数比你在sequence equals上的工作更快。实际上你的(Class1)compareState是耗时的,而且你的序列比较也很耗时。

+0

不需要设置有效的哈希码。因为它会在检查哈希码后使用equals方法。所以它会工作正常。并设置一个有效的哈希码:我不得不相同的数组我得到他们的哈希码,这是不同的!我无法找到另一种方式。 – Masoud 2011-01-08 14:18:44

+0

@Saeed。我用克隆方法。 ---->伪代码:sbyte [] array1 = new sbyte [100]; array1.setValues(); sbyte [] array2 =(sbyte [])array1.Clone(); array1.getHashCode与array2.getHashCode()不相等;感谢您的贡献 – Masoud 2011-01-08 14:32:51

2

不修的哈希码为1,因为它会对于依靠散列处理一堆碰撞的数据结构进行必要的。在这种情况下,使用哈希表或链接列表不会有任何区别。当搜索对象时(例如通过调用Cointains方法),有必要评估集合中的每个对象,复杂度为O(N),而不是通过哈希代码复杂度O(1)来访问对象。