如何在java的gcd函数中应用记忆?

vfwfrxfs  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(400)

我必须计算多对数字的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中。

k5hmc34c

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)); }

相关问题