什么是堆栈循环的bigO?

时间:2018-12-05 22:24:10

标签: javascript algorithm time-complexity big-o

当您的函数具有多个非嵌套循环时,是否会改变O(N)的时间复杂度?我知道,如果您要编写一个函数来记录数组的每个元素,则可以通过一个循环来执行此操作,从而为您提供O(N)的bigO,但是如果您添加更多的循环,那么将为您提供一个bigO O(N *循环数)?

考虑此字符串压缩功能,鉴于它多次遍历字符串,它是什么bigO:

 function compression(string) {
  let compressed = "";
  let map = {

  }

  string.split("").forEach((e, i) => {
    map[e] = 0;
  })

  string.split("").forEach((e, i) => {
    map[e] += 1;
  })

  for (var element in map) {
    compressed += element + map[element];
  }
  if (compressed.length > string.length) {
    return string;
  } else {
    return compressed;
  }
}

2 个答案:

答案 0 :(得分:1)

对于如您所示的非嵌套循环,时间复杂度保持为O(N)。这是因为循环数是一个常数-例如,如果您对N个元素运行3次,则使用大O表示法可以删除该常数。因此,它仍然是O(N)。

注意:这假设循环数是一个常数。如果循环数以任何方式取决于元素数,那么您将需要考虑这种关系。

答案 1 :(得分:0)

根据定义,当算法需要在大小为O(N)的输入上执行的基本运算次数f(N)满足时,算法为N

f(N) <= C.N    ; N >= N0

对于独立于C的某个正常数N,其中N0是一些初始索引,也独立于N

假设您将三个循环组合在一起,每个循环O(N)。根据定义,您将拥有三对常量(C1, N1)(C2, N2)(C3, N3),这样

loop1(N) <= C1.N  ; N >= N1
loop2(N) <= C2.N  ; N >= N2
loop3(N) <= C3.N  ; N >= N3

然后

loop1(N) + loop2(N) + loop3(N) <= (C1 + C2 + C3)N       ; N >= max(N1,N2,N3)

O(N)的定义适用于常数C = C1+C2+C3和初始索引N0 = max(N1,N2,N3)。因此,由于常数O(N)O(N)并不依赖于C,因此常数N0算法的串联还是N