就时间复杂度而言,是这样的:
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)。我说的对吗?
很多不同的东西:
-
在这种情况下,链接不会以任何方式影响时间复杂度。这只是语法上的区别。
-
我假设 n 设计了您要处理的句子中的单词数。O(n) 是对时间复杂度的错误估计。有效的比较排序通常采用 O(nlog(n)) 比较。除此之外,您正在比较字符串,因此比较不是在恒定时间内进行的(相对于字符串的长度)。这并没有改变复杂度为 O(nlog(n)) 的事实,因为字符串的长度可能不依赖于 n。
-
根据定义,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)
来表示,其中s
是string
的长度,w
其中的单词数,s/w
平均单词长度(字符串比较所需的时间);简化为O(s log w)
。
不,这没有任何区别(实际上,也许非常非常小,但从 O(n) 到 O(n^2)的复杂度很高)。
你是对的,你的代码是O(n log n),其中n是字符串中的单词数。
排序方法可能是使用快速排序实现的,在一般情况下是 O(n log n),而您的 reduce 是一个简单的循环 O(n)。