我们有一个测试练习,你需要找出给定的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
的复杂性但找不到它。 用于C#并表示其O(1),而This SO post表示其O(1)但可能会迭代所有双精度。
我试图了解这种方法最糟糕的时间复杂性。所有其他操作都是O(1),因此这是唯一的因素。 非常感谢任何反馈!
答案 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)循环里面。