就时间复杂性而言,是:
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 )。我是对的吗?
答案 0 :(得分:4)
很多不同的事情:
在这种情况下,链接不会以任何方式影响时间复杂度。这只是一种语法差异。
我假设n设计了你想要处理的句子中的单词数。 O(n)是对时间复杂度的不正确估计。有效的比较排序通常需要进行O(nlog(n))比较。除此之外,您正在比较字符串,因此不会在恒定时间内进行比较(相对于字符串的长度)。这并没有改变复杂度为O(nlog(n))的事实,因为字符串的长度可能并不依赖于n。
O(3n)= O(2n)= O(n),这正是O的意思。查看您的Landau notation。
编辑:在评论之后,让我对复杂性的推理更加清晰。
对于在空格上拆分句子的结果,调用sort
函数,这会将sort
应用于一系列单词。
我不知道sort
是如何实现的,但它很可能是一种比较排序,这意味着它大致进行O(n*log(n))
比较,其中n是要排序的项目数:这里这句话的话。
现在,我们知道我们将进行O(n*log(n))
字符串比较,这与字符串的长度不同。字符串比较在最差的L操作中进行,L长度是要比较的两个字符串的最小长度。现在让L作为被排序字符串的最大长度。从已经说过,我们将进行大约O(L*n*log(n))
次操作来对数组进行排序。由于L没有理由依赖于n,因此我们对时间compexity进行了O(L*n*log(n)) = O(n*log(n))
次操作。
答案 1 :(得分:1)
链接是否会增加时间复杂度?
不,中间变量不会改变时间复杂度,算法完全相同。
我相信每个都有时间复杂度
O(n)
。我是对的吗?
不,虽然您尚未说明n
措施。
您的算法的复杂性可以表示为O(s + (s/w) w log w)
,其中s
是string
的长度,w
其中的字数和s/w
平均字长(字符串比较所需的时间);这简化为O(s log w)
。
答案 2 :(得分:0)
不,这没有任何区别(实际上,可能非常非常小,但是从O(n)到O(n ^ 2)的复杂性非常远)。
你纠正了,你的代码是O(n log n),n是你字符串中的单词数。
sort方法可能是使用quicksort实现的,平均情况下为O(n log n),而reduce是一个简单的循环,O(n)。