时间复杂度(关于n个输入)

时间:2019-08-12 10:44:34

标签: algorithm time-complexity

我被问到这是否需要几点时间?

此算法的时间复杂度(相对于n)是多少?

k=0
for(i = n / 2 ; i < n ; i++ ) {
   for( j=0 ; j < i ; j++)
      k = k + n / 2
}

选择是:a. O(n) b. O(n/2) c. O(n log(n)d. O(n^2)

can have a multiple answers.

我知道上面的算法是d. O(n^2),但是我附带了a. O(n),因为它只在寻找complexity of n

如果您有这个问题。您将如何回答??我对答案很好奇。

1 个答案:

答案 0 :(得分:1)

答案是O(n²)。

这很容易理解。我会尽力让您理解。

请参见,外部for循环块已执行n - n/2 = n/2次。

当然,这取决于数字n是偶数还是奇数。如果是,则外循环执行n/2次。如果很奇怪,它将执行(n-1)/2次。

但是由于时间复杂性,我们不考虑这一点。我们仅假设外部for循环执行了n/2次,其中in/2开始并在n - 1结束(因为终止条件为{{1 }},而不是i < n

对于外循环的每次迭代,内循环执行i <= n次。

例如,对于每次迭代,内部循环都从ij = 0开始。这意味着它将执行j = i - 1次(而不是i次,因为i - 1从0开始而不是从1开始)。

因此,对于第一次迭代,内部循环执行了j次。 i = n / 2用于第二次迭代,依此类推,最多i = n / 2 + 1次。

现在,总数。内部循环执行的次数为i = n - 1。这是简单的数学运算,它最多可以累加n/2 + (n/2 + 1) + (n/2 + 2) + ... + (n - 2) + (n - 1)次。

因此,时间复杂度变为O((3n²-n)/ 2)。

但是我们忽略(3n² - n)/2项,因为n和常数项是因为对于每个n² > n它们将保持不变。

因此,最终时间复杂度为O(n²)。

希望这可以帮助您理解。