O(2M N)和O(kN)的时间复杂性

Time complexity of O(2m+n) and O(kn)

本文关键字:时间复杂性 kN 2M      更新时间:2023-10-16

func(){
   for(i = 0; i < m; i++){//do something}
   for(i = 0; i < n; i++){//do something}
   for(i = 0; i < m; i++){//do something}
}

将其时间复杂性写入o(2m n(= o(m n(是正确的,因为o(2m(= o(m(?

以及另一个问题,如果我具有迭代大小为n,k-times的数组,其中k是从输入中计算到函数之前从输入中计算出来的。

func(int k){
    for(int i = 0; i < k; i++){
        for(int j = 0; j < n; j++){}
    }
}

可以说它的时间复杂性是o(k*n(= o(n(的原因与第一个问题相同的原因?

将其时间复杂性写入o(2m n(= o(m n(是正确的,因为o(2m(= o(m(?

是。大oH表达式的术语可以分为单个的大oh表达式,因此O(2m+n) = O(2m) + O(n) = O(m) + O(n) = O(m+n)

可以说它的时间复杂性是o(k*n(= o(n(的原因与第一个问题相同的原因?

否,因为k不是常数。

第一个是正确的,因为数字 2是恒定的,因此与时间coplexity没有区别。

但是,第二个可能既是错误又正确。如果将k视为永远不会改变的常数,则时间复杂性为O(n)。但是,如果k是可变的,则时间复杂性严格 O(kn),因为k可以增加或减少,因此会在渐近时间复杂性上有所不同。

因此,在您的情况下,复杂性是严格的O(kn)

让我们从大o的定义中谈论这一点:

我们说f(n(= o(g(n((,如果对于任何正n₀,存在常数的c = c(n₀(,因此对于任何n>n₀,f(n(的确如此≤cg(n(。

因此,在您的第一种情况下,如果我们选择一个常数c,则有O(2m n(≤O(2m 2n(= O(m n(。

但对于第二种情况,对于您选择的任何C,都存在这样的k以使要求失败,因此第二种情况不能为O(n(。实际上是O(kn(。(您可能会说如果调节可变k,则是o(n(,在这种情况下,您可以选择比k上限大的C(

在具有3个循环的第一个函数中,其中两个从(零(开始到(m(,第三个从(零(开始到(n(,因此时间复杂性此函数的 O(2M N( = o(m n( = o(n(,这种情况称为"线性时间复杂性"这意味着,当(M(或(N(的值增加时,时间复杂性线性增加,因此第一个函数的时间复杂性为true

在具有两个嵌套循环的第二个函数中,内部环从(零(启动到(n(并重复(k(次,例如(k = 3(和(n = 2(,这是指内部循环从(零(开始到(2(,然后重复3次,因此时间复杂度为O(2 2 2(= O(2*3(= O(n k(,,因此,第二个功能的时间复杂性为 o(n k(