【问题标题】:Derivative of a Polynomial via HashMap. How to iterate over HashMap<Degree,Coeff>?通过 HashMap 对多项式求导。如何迭代 HashMap<Degree,Coeff>?
【发布时间】:2015-12-02 09:40:07
【问题描述】:

我想写一个多项式的导数方法。我的输入格式是存储度数和系数的 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;

}

【问题讨论】:

    标签: java performance time iterator hashmap


    【解决方案1】:

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

    TreeMap 是一个具有键顺序的类。然后你可以像这样遍历它:

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

    编辑:正如 John Bollinger 在 cmets 中建议的那样,在计算导数时,键的顺序并不重要,因此您可以简单地迭代 HashMap,与我演示的方式完全相同上面有TreeMap

    【讨论】:

    • HashMaps 没有按照很容易从它们的键中预测的顺序进行迭代是正确的。然而,一般来说,多项式的项可以在计算其导数时以任何顺序进行处理。
    【解决方案2】:

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

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

    【讨论】:

    • 当我写这个时:deggreeAndCoeff.put(entry.getKey()-1, entry.getValue()*entry.getKey());它给出了一个错误。我想就地使用相同的 HashMap。但是当我创建新的时,它确实有效。 deggreeAndCoeff.put(entry.getKey()-1, entry.getValue()*entry.getKey()) 有什么问题?谢谢!
    • 当对其中一个集合视图的迭代正在进行时,您不能修改映射,否则迭代器将抛出 ConcurrentModificationException。如果您愿意,在计算完导数后,您可以执行degreeAndCoeff.clear(); degreeAndCoeff.putAll(result); 以将结果返回原始Map
    猜你喜欢
    • 2016-01-08
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 2016-06-11
    • 2010-10-24
    • 2011-12-02
    • 1970-01-01
    相关资源
    最近更新 更多