我必须计算多对数字的gcd,所以为了优化,我打算将记忆应用到我的函数中。
配对类别:
class Pair{
private long a;
private long b;
Pair(long a,long b){
this.a = a;
this.b = b;
}
}
my hashmap(是一个静态变量)
public static Map<Pair, Long> hashmap = new HashMap<>();
我的gcd功能:
public static long gcd(long a,long b) {
if(hashmap.containsKey(new Pair(a,b))) {
return hashmap.get(new Pair(a,b));
}
if(hashmap.containsKey(new Pair(b,a))) {
return hashmap.get(new Pair(b,a));
}
if(a == 0) {
return b;
}
long GCD = gcd(b%a,a);
if(hashmap.containsKey(new Pair(a,b)) || hashmap.containsKey(new Pair(b,a))) {
return GCD;
}
hashmap.put(new Pair(a,b),GCD);
return GCD;
}
但是,当我打印hashmap的键和值时,它包含重复项。这意味着我的函数不能应用memonization,而是将pair放入hashmap中。
1条答案
按热度按时间k5hmc34c1#
我可以看到你的代码中有一些修改。
你没有一个
hashCode
为您的Pair
班级。您可以使用这里描述的方法实现一对long的hashcode。你没有一个
equals
方法。你可以直接写this.a == other.a && this.b == other.b
作为平等的条件。及other
是一个例子Pair
.本声明:
if(hashmap.containsKey(new Pair(a,b)) || hashmap.containsKey(new Pair(b,a))) { return GCD; }
这是不需要的。在调用递归gcd之前,您已经检查了它实际上,不管密钥是pair(a,b)还是pair(b,a),equals和hashcode都应该返回相同的值,因此不需要检查
if(hashmap.containsKey(new Pair(b,a))) { return hashmap.get(new Pair(b,a)); }