📜  资质| GATE CS 1998 |问题3(1)

📅  最后修改于: 2023-12-03 14:57:47.969000             🧑  作者: Mango

资质:

GATE CS 1998

问题3:

在下面的C函数中,for循环的求解次数是多少?

int fun(int n) {
    int i, j;
    for (i = n; i > 1; i = i / 2) {
        for (j = 0; j < i; j++) {
            // some O(1) operations
        }
    }
}
解答:

对于给定的参数n,循环的求解次数为$O(nlogn)$。

外循环的求解次数是$log_2{n}$, 因为i是每次除以2的,我们可以这样来看:

  • 初始值 $i=n$
  • 最后一个数 $i=1$, 且 $2^k=1$,其中 $k=log_2n$
  • 因此, 最多我们可以除以 $k$ 次,也就是外循环的次数。

内循环是墨菲定律的常见形式,因此我们需要考虑两个循环的执行次数。

  • 当循环开始时, $j=0, i=n$
  • 当i为偶数时,j循环次数是n
  • 当i为奇数时,j循环次数是n/2

因此,总的操作次数是:

$=j+n + j+\frac{n}{2} + j+\frac{n}{4} + j+\frac{n}{8}$ $+\cdots$

$=n(1 + \frac{1}{2} + \frac{1}{4} + \frac{1}{8} + \cdots )$ $ + j(1 + \frac{1}{2} + \frac{1}{4} + \frac{1}{8} + \cdots )$

$=\frac{n}{1-\frac{1}{2}} O(1) $

$= O(n).$

因此,我们可以得出这个函数的时间复杂度为 $O(nlogn)$。

**注意:**由于本题并未提供输出,上述分析仅供参考。