什么是此解决方案的时间复杂度O(N)或O(LogN)?

时间:2017-05-10 11:52:58

标签: javascript algorithm asymptotic-complexity

https://codility.com/programmers/lessons/1-iterations/

考虑到这一点:

if (largestHole > (bin.length - i) && subHole < (bin.length - i)) {
  break;
}

如果到目前为止最大孔的长度小于剩余数字的长度,则检查它是否会打破循环

此行let bin = parseInt(N, 10).toString(2);用于将数字从基数10转换为基数2字符串,这是我迭代的内容。

function solution(N) {
  let bin = parseInt(N, 10).toString(2);
  let subHole = 0;
  let largestHole = 0;
  for (var i = 0; i < bin.length; i++) {
    if (largestHole > (bin.length - i) && subHole < (bin.length - i)) {
      break;
    }
    if (bin[i] === '0') { subHole++; }
    else {
      if (subHole > largestHole) {
        largestHole = subHole;
      }
      subHole = 0;
    }
  }
  return largestHole;
}

https://codility.com/programmers/lessons/1-iterations/

2 个答案:

答案 0 :(得分:2)

仍然是O(n)。复杂性没有考虑系数。此外,O(log n)函数就像二进制搜索。

编辑: O(log n)算法的简单解释: 以二进制搜索为例。你有一个数字x,比如1到100,它隐藏在一个排序数组中,包含从1到100的n个数字。你从数组的中间开始,取决于比较中间数的大小到x,你搜索数组的左半部分或右半部分。该过程以递归方式继续,直到找到该号码。

例如我想在[1,3,5,6,7,9,10]中找到5。 我从第四名开始。它是6,它大于5,所以我们从1到5搜索左半部分。然后,我在窄范围内再次检查中间位置,即3。它小于5 ,所以我们搜索右半边。此时我们只剩下一个数字 - 即5。

搜索会将数组分成两半,因此最糟糕的情况是log 2 n(n的基数2对数)。那是一个O(log n)函数。

然而,正如我所说,复杂系数并不重要。例如,冒号排序通常需要大约(n ^ 2)/ 2圈,但我们只计算为O(n ^ 2),忽略1/2系数。

答案 1 :(得分:1)

我同意O(n)但实际上它取决于parseInt函数的实现。