我想知道如何计算这种组合的时间复杂度:
"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)
那么时间复杂度是多少?
更新
X轴=>时间ms
Y轴=>输入字符串长度
随机生成的数据
复杂度显然是线性的。
答案 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是字符数。