[英]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.