通过HashMap导出多项式。如何迭代HashMap <degree,coeff>?

时间:2015-09-06 21:16:49

标签: java performance time iterator hashmap

我想为多项式编写一个推导方法。我的输入格式是存储度和系数的HashMap。这种方式(与数组类型输入相比)在空间方面更好,如果你的多项式有很多零系数,但根据我的代码,我需要迭代n次,其中n是多项式的次数,而不是HashSet的大小。像1 + x ^ 100的HashMap大小为2,但是度为100.为了减少时间复杂度,我需要仅对HashSet进行计算。我们可以减少从n到HashMap大小的迭代次数吗?这是我的代码:

public static HashMap<Integer, Double> derivativePoly2(HashMap<Integer, Double> degreeAndCoeff) {
    int len = degreeAndCoeff.size();
    int i = 0;
    while (i < Integer.MAX_VALUE && len - 1 > 0) {
        if (degreeAndCoeff.containsKey(i + 1)) {
            --len;
            degreeAndCoeff.put(i, degreeAndCoeff.get(i + 1) * (i + 1));
            degreeAndCoeff.remove(i + 1);
        }
        ++i;
    }

    return degreeAndCoeff;

}

2 个答案:

答案 0 :(得分:1)

HashMap不会为您提供密钥的排序(我认为这是他们在这种情况下需要的)。

TreeMap是一个具有密钥排序的类。然后你可以像这样迭代它:

for(Map.Entryp<Integer, Double> entry : degreeAndCoeff.entrySet()) {
  Integer key = entry.getKey();
  Double value = entry.getValue();
}

编辑:正如John Bollinger在评论中所建议的那样,在计算导数时,键的排序无关紧要,因此您可以简单地迭代HashMap,方法与我在上面用TreeMap进行了演示。

答案 1 :(得分:1)

您可以使用条目集或密钥集的迭代器。例如:

public static Map<Integer, Double> derivativePoly2(Map<Integer, Double> degreeAndCoeff) {
    Map<Integer, Double> result = new HashMap<Integer, Double>();

    for (Map.Entry<Integer, Double> term : degreeAndCoeff.entrySet() {
        int exponent = term.getKey();
        double coefficient = term.getValue();

        // ... result.put(something, somethingElse);
    }

    return result;
}