Javascript 字符串分割映射组合的时间复杂度

Javascript 字符串分割映射组合的时间复杂度,javascript,algorithm,time-complexity,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是一个线性复杂度函数,不知道它在做什么 因此,根据.split(“”的时间复杂度将是O(n) 在下一行中

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

"some string"
   .split(" ") // O(n)
   .map( 
      word => doSomething(word) // word length = j, doSomething(word) => O(j)
    ) // O(n * j) => O(n^2) ???
doSomething
是一个线性复杂度函数,不知道它在做什么

因此,根据.split(“”的时间复杂度将是
O(n)

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

在map函数中,我们对长度为
j
=>
O(j)
的单词执行一些操作。考虑到这一点,该单词可以是完整字符串的大小(无空格)
O(j)=>O(n)

因此,我们的总体时间复杂度
O(n^2)

但若我们在.map步骤
O(n)
中有最坏的情况,那个么我们就不能在map中有最坏的情况,因为所有单词长度的总和就是输入字符串的大小。所以我们不能将
O(j)转换为O(n)

那么,时间复杂性将是什么


更新

好的,我做了一些实验,这是我在电脑上得到的

X轴=>时间毫秒

Y轴=>输入字符串长度

随机生成的数据

复杂性显然是线性的

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

我同意拆分为O(n)

有趣的部分是
地图
。在这里,您为复杂性的上限提供了正确的参数。的确,代码也是O(n²)(注意,O(n)是O(n²)的一个子集,这并不矛盾)。但是,可以进行更精确的评估。请注意,您估计的最坏情况不能同时发生:

  • 如果一个单词是整个字符串的大小,则不能有多个单词
  • 如果每个单词有一个字符(最大字数),那么每个单词就有一个字符
每个单词的字符总数总是句子的长度。复杂度是O(所有单词字符长度的总和),在最坏的情况下,我们没有同时估计字符长度和单词数量,而是注意到这只是O(n)

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

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

我同意拆分为O(n)

有趣的部分是
地图
。在这里,您为复杂性的上限提供了正确的参数。的确,代码也是O(n²)(注意,O(n)是O(n²)的一个子集,这并不矛盾)。但是,可以进行更精确的评估。请注意,您估计的最坏情况不能同时发生:

  • 如果一个单词是整个字符串的大小,则不能有多个单词
  • 如果每个单词有一个字符(最大字数),那么每个单词就有一个字符
每个单词的字符总数总是句子的长度。复杂度是O(所有单词字符长度的总和),在最坏的情况下,我们没有同时估计字符长度和单词数量,而是注意到这只是O(n)


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

@ASDFGerte这对于数组本身的操作是正确的,但对每个元素运行
doSomething(…)
中的处理。因此,该函数的复杂性将乘以
map
的迭代次数。复杂性应为
O(n)
,因为所述的
doSomething(…)
与拆分字符串的长度有关。它最多只能对长度为
n
的字符串执行一次操作,或者处理单个字符
n/2
次。无论如何,处理完全是基于字符串长度的线性函数,因此
O(n)
@DanielWStrimpel根据他的示例,
doSomething
是O(j),其中j是字长。你每个字都这么做,那又是n。您执行一个O(n)操作,
split
,然后执行另一个O(n)操作,
map
(使用
doSomething
),结果总共是O(n)。实际上,我想强调的主要一点是,首先进行
拆分
,然后进行
映射
,两者之间不是相乘的。你把两个O(n)操作连在一起,这并不能让你得到O(n^2),这是他在问题中提出的。我认为困惑来自我没有完全理解OP的问题所在。在你的论证中,你在做一个“复杂度明显小于或等于”,最坏的情况下可以是O(n/2)=>O(n)”和“单词可以是整个字符串的大小”。这是可能的,您得出的结论是,它最多为O(n²)。然而,这是没有用的。由于每个单词的字符总数等于字符串字符长度,因此复杂性将低于您选择的上限。为了进一步说明,您假设两点为最坏情况,而这两点不能同时发生。如果一个单词是整个字符串的大小,则不能有多个单词,另一方面,如果每个单词有一个字符,则每个单词有一个字符。总和将始终相同,即原始字符串的总长度。Nice:)。很抱歉最初的混乱。我认为这是因为我没有缓慢而严格地阅读问题,因此没有清楚地理解您在理解哪一部分时遇到的问题。@ASDFGerte这对于数组本身的操作是正确的,但是
doSomething(…)
中的处理是针对每个元素运行的。因此,复杂性