有人问我,如果时间复杂的话:
该算法的时间复杂度(关于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
?是的。如果你有这个问题的话你怎么回答呢。?我对答案很好奇。
最佳答案
答案是O(nè)。
这很容易理解我会尽力让你明白的。
请参阅,执行外部循环块for
次。
当然,这取决于数字n - n/2 = n/2
是偶数还是奇数。如果是偶数,则执行外部循环n
次。如果是奇数,则执行n/2
次。
但对于时间复杂度,我们不考虑这一点。我们只是假设外部(n-1)/2
循环执行for
次,其中n/2
从i
开始并在n/2
结束(因为终止条件是n - 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)。
希望这能帮助你理解。