链接排序和减少是否会增加从 O(n) 到 O(n ^ 2) 的时间复杂度?



就时间复杂度而言,是这样的:

let string = "I am a little teapot"
let wordArray = string.split(' ').sort()
let store = wordArray.reduce( (acc, word) => {
acc[word] = acc[word] + 1 || 1;
return acc;
}, {}) 

还有比这更好的吗?

let string = "I am a little teapot"
let store = string.split(' ').sort().reduce( (acc, word) => {
acc[word] = acc[word] + 1 || 1;
return acc;
}, {}) 

我相信这些中的每一个都有时间复杂度O(n)。我说的对吗?

很多不同的东西:

  1. 在这种情况下,链接不会以任何方式影响时间复杂度。这只是语法上的区别。

  2. 我假设 n 设计了您要处理的句子中的单词数。O(n) 是对时间复杂度的错误估计。有效的比较排序通常采用 O(nlog(n)) 比较。除此之外,您正在比较字符串,因此比较不是在恒定时间内进行的(相对于字符串的长度)。这并没有改变复杂度为 O(nlog(n)) 的事实,因为字符串的长度可能不依赖于 n。

  3. 根据定义,O(3n) = O(2n) = O(n),这正是 O 的意思。查看您的朗道符号。

编辑:在评论之后,让我更清楚地说明复杂性的推理。

sort函数是根据在空格上拆分句子的结果调用的,这归结为将sort应用于单词序列。

我不知道sort是如何实现的,但它很可能是一种比较排序,这意味着它大致O(n*log(n))比较,其中 n 是被排序的项目数:这里是句子的单词。

现在,我们知道我们将进行O(n*log(n))字符串比较,相对于字符串的长度,这不是恒定的时间。字符串比较最差的是 L 操作,L 的长度是要比较的两个字符串的最小长度。现在让我们将 L 作为要排序的字符串的最大长度。综上所述,我们将大致执行O(L*n*log(n))操作来对数组进行排序。由于 L 没有理由依赖 n,因此我们有时间一致性的O(L*n*log(n)) = O(n*log(n))运算。

链接会增加时间复杂度吗?

不,中间变量不会改变时间复杂度,算法完全相同。

我相信这些中的每一个都有时间复杂度O(n)。我说的对吗?

不,尽管您尚未说明n措施。

你的算法的复杂度可以用O(s + (s/w) w log w)来表示,其中sstring的长度,w其中的单词数,s/w平均单词长度(字符串比较所需的时间);简化为O(s log w)

不,这没有任何区别(实际上,也许非常非常小,但从 O(n) 到 O(n^2)的复杂度很高)。

你是对的,你的代码是O(n log n),其中n是字符串中的单词数。

排序方法可能是使用快速排序实现的,在一般情况下是 O(n log n),而您的 reduce 是一个简单的循环 O(n)。

最新更新