我被问到这是否需要几点时间?
此算法的时间复杂度(相对于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
?
如果您有这个问题。您将如何回答??我对答案很好奇。
答案 0 :(得分:1)
答案是O(n²)。
这很容易理解。我会尽力让您理解。
请参见,外部for
循环块已执行n - n/2 = n/2
次。
当然,这取决于数字n
是偶数还是奇数。如果是,则外循环执行n/2
次。如果很奇怪,它将执行(n-1)/2
次。
但是由于时间复杂性,我们不考虑这一点。我们仅假设外部for
循环执行了n/2
次,其中i
从n/2
开始并在n - 1
结束(因为终止条件为{{1 }},而不是i < n
。
对于外循环的每次迭代,内循环执行i <= n
次。
例如,对于每次迭代,内部循环都从i
到j = 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²)。
希望这可以帮助您理解。