最简单的Java中Math.sqrt的时间复杂度

时间:2016-02-20 13:41:46

标签: java math time-complexity math.sqrt

我们有一个测试练习,你需要找出给定的N数是否是另一个数的平方或没有,时间复杂度最小。

我写道:

public static boolean what2(int n) {
    double newN = (double)n;
    double x = Math.sqrt(newN);
    int y = (int)x;
    if (y * y == n)
        return false;
    else
        return true;
}

我在线查看,特别是在SO上试图找到sqrt的复杂性但找不到它。 enter image description here用于C#并表示其O(1),而This SO post表示其O(1)但可能会迭代所有双精度。

我试图了解这种方法最糟糕的时间复杂性。所有其他操作都是O(1),因此这是唯一的因素。 非常感谢任何反馈!

3 个答案:

答案 0 :(得分:3)

使用浮点转换是正常的,因为java的int类型是32位而java的double类型是IEEE 64位格式,它可以精确地表示32位整数的所有值。

如果要为long实现功能,则需要更加小心,因为许多大long值并不完全表示为double s,因此取平方根并将其转换为整数类型可能不会产生实际平方根。

您的实施中的所有操作都会在固定时间内执行,因此您的解决方案的复杂性确实是 O(1)

答案 1 :(得分:1)

如果我正确理解了这个问题,可以通过即时编译来转换Java指令以使用本机fsqrt指令(但是我不知道这是否真的是这种情况),根据{{​​3}},使用有限数量的处理器周期,这意味着复杂度为O(1)

答案 2 :(得分:0)

java的Math.sqrt实际上将sqrt委托给StrictMath.java源代码,其中一个实现可以找到here,通过查看sqrt函数,看起来复杂性是恒定时间。看看while(r!= 0)循环里面。