我有很多对象。我应该评估一名他们的成员。他们一个接一个。首先是逐一评估-------->伪代码在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镜头的数据。我错了什么?
任何帮助将受到高度的欢迎。
我认为它是`evaluateObjects.Contain(obj)`语句导致你的代码放缓。你的所有对象都有相同的密钥(相同的散列码),使你的散列表与链接列表相同。在这种情况下,您的搜索将具有O(N)而不是O(1)的复杂性。 – 2011-01-08 14:13:55
是的。 \ o /那是对的。但是,我怎样才能改变一个sbyte数组的getHashCode方法来为一个数组返回相同的值,它的克隆版本呢? – Masoud 2011-01-08 14:35:06