字符串分割图组合的时间复杂度

时间:2019-10-21 17:53:40

标签: javascript algorithm time-complexity

我想知道如何计算这种组合的时间复杂度:

"some string"
   .split(" ") // O(n)
   .map( 
      word => doSomething(word) // word length = j, doSomething(word) => O(j)
    ) // O(n * j) => O(n^2) ???

doSomething是一个线性复杂度函数,与执行的功能无关。

因此,根据Big O of javascript built-in split function.split(" ")的时间复杂度将为O(n)

在下一行,我们在单词数组上有一个.map,在最坏的情况下,当我们所有单词都包含一个字符时,它可能是O(n/2) => O(n)

内部映射函数中,我们对长度为j => O(j)的单词进行某些操作。考虑到这个词可以是完整字符串的大小(无空格)O(j) => O(n)

结果,我们的总体时间复杂度为O(n^2)

但是,如果我们在.map步骤O(n)上遇到最坏的情况,那么在map内部就不会出现最坏情况,因为所有单词长度的总和是输入字符串的大小。因此,我们无法转换O(j) to O(n)

那么时间复杂度是多少?


更新

好吧,我做了一些实验性的测量,这是我在电脑上得到的 https://www.wolframalpha.com/input/?i=listplot%5B%7B%7B10%2C+0.015%7D%2C%7B100%2C+0.1%7D%2C%7B1000%2C+0.72%7D%2C%7B10000%2C+8.5%7D%2C%7B100000%2C+67.89%7D%2C+%7B1000000%2C+642.60%7D%2C+%7B10000000%2C+6657.4%7D%2C+%7B100000000%2C+70076.01%7D+%7D%5D

X轴=>时间ms

Y轴=>输入字符串长度

随机生成的数据

复杂度显然是线性的。

1 个答案:

答案 0 :(得分:0)

代码为O(n),其中n是字符串的长度:

我会同意split为O(n)。

有趣的部分是map。在此,您可以给出正确的参数以说明复杂性的上限。的确,代码也是O(n²)(请注意,O(n)是O(n²)的子集,因此它并不矛盾。但是,可以进行更精确的评估。请注意,您估计的最坏情况不能同时发生:

  • 如果一个单词等于整个字符串的大小,则不能超过一个单词
  • 如果每个单词有一个字符(最大单词数),则每个单词只有一个字符

每个单词的字符总和将始终是句子的长度。复杂度为O(所有单词的字符长度之和),而不是在最坏的情况下估算字符长度和单词数量,我们注意到这只是O(n)。

由于恒定数量的O(n)操作的顺序链接仍然是O(n),我们得到了上面提到的O(n)的总体复杂度,其中n是字符数。