我有以下功能:
void foo(int n){
int i = 0;
double temp = 0;
for (i = 1; i < n ; i++){
temp = sqrt(i * 1.0);
if (temp == (int)temp){
printf("%d ", i);
}
}
}
时间复杂度为:O(n),有没有办法使时间复杂度低于n?
答案 0 :(得分:4)
看起来这个函数正在搜索最高n
的正方形。不是将每个数字的平方根取为n
,而是将每个数字加到sqrt(n)
:
void foo(int n){
int i = 0;
for (i = 1; i*i < n ; i++){
printf("%d ", i*i);
}
}
不仅是这个O(sqrt(n)),而且还删除了sqrt
函数中的浮点运算。
答案 1 :(得分:1)
在O(sqrt(n))时间@Lee Daniel Crocker中很容易做到,即使没有乘法也是如此。
void foo_no_multiple(int n) {
int i = 0;
int ii = 1;
while (ii <= n) {
i++;
printf("%d ", ii);
ii += i + i + 1;
}
printf("\n");
}
int main(void) {
foo_no_multiple(10);
return 0;
}
输出
1 4 9
答案 2 :(得分:0)
时间复杂度为O(sqrt(n))
只是因为我们不是循环n
而是循环sqrt(n)
。
void foo(int n)
{
int i = 1;
int tmp = 1;
while (tmp < n)
{
printf("%d ", tmp);
i++;
tmp = i * i;
}
}