【发布时间】:2016-06-02 03:12:55
【问题描述】:
我们有一个测试练习,您需要找出给定的 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 的复杂性,但找不到。 This SO post 用于 C#,表示其 O(1),this Java post 表示其 O(1),但可能会遍历所有双精度数。
我试图了解这种方法的最差时间复杂度。所有其他操作都是 O(1),所以这是唯一的因素。 希望有任何反馈!
【问题讨论】:
-
你为什么不用
log? -
不确定这对您来说是否显而易见,但此函数不回答所提出的问题 - 它只回答数字是正方形。
-
如果数字是正方形,它应该返回 false,如果不是 @ThomasAndrews,它应该返回 true
-
这肯定不能在少于 O(log N) 的时间内完成,因为每一位都是相关的,所以你必须阅读每一位 log N 位。
-
另外,请注意
int y=(int) x;不会四舍五入,因此如果平方根函数的错误返回 202.999999999,那么您将测试错误的值。您需要使用实际的舍入函数,或使用(int)(x+0.5);
标签: java math time-complexity math.sqrt