时间复杂度O(n)[C]

时间:2017-06-01 17:53:56

标签: c time-complexity

我有以下功能:

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?

3 个答案:

答案 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;
    }
}