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

时间:2017-03-25 21:18:47

标签: javascript algorithm time

就时间复杂性而言,是:

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 )。我是对的吗?

3 个答案:

答案 0 :(得分:4)

很多不同的事情:

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

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

  3. 根据定义,
  4. O(3n)= O(2n)= O(n),这正是O的意思。查看您的Landau notation

  5. 编辑:在评论之后,让我对复杂性的推理更加清晰。

    对于在空格上拆分句子的结果,调用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),其中sstring的长度,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)。