我需要找到一种检查整数是否为质数的算法的时间复杂度?该算法有点不同,它使用while循环来完成其任务
这是Java中的方法:
public static boolean isPrime(int num) {
int i = 2;
boolean isPrime = false;
while(num % i != 0) {
i += 1;
}
if (num == i) {
isPrime = true;
}
return isPrime;
}
对于while循环,我有一个比较,而在循环外有一个if语句,if语句将总是运行一次,所以O(1)。现在while循环的big-O是什么?是O(n)吗?
答案 0 :(得分:2)
您的方法可能会有一些小问题(在下面解决),但是您的方法应该是O(n)
,其中n
是isPrime()
的输入值/大小。也就是说,在这种蛮力方法中,您基本上只是循环遍历每个小于输入的可能值以找到完全匹配。
我会改写为:
// assuming positive integers only
public static boolean isPrime(int num) {
if (num == 1) return false;
boolean isPrime = true;
for (int i=2; i < Math.sqrt(num); ++i) {
if (num % i == 0) {
isPrime = false;
break;
}
return isPrime;
}
我检查输入是否为1,在这种情况下,它不是素数。同样,此方法还有一个好处,就是它最多检查sqrt(num)
个可能的除数。除此以外的任何除数都可能无法平均划分,因此检查没有意义。如果找到除数,则从for
循环中退出。
答案 1 :(得分:1)
是的,它是O(N)
。 N是num
。