为什么时间复杂度与单词O(n)的句子相反?

时间:2017-08-23 02:03:17

标签: c algorithm time-complexity

我遇到了这篇文章Reverse words in a given string

代码是

void reverseWords(char *s)
{
    char *word_begin = NULL;
    char *temp = s; /* temp is for word boundry */

    /*STEP 1 of the above algorithm */
    while( *temp )
    {
        /*This condition is to make sure that the string start with
          valid character (not space) only*/
        if (( word_begin == NULL ) && (*temp != ' ') )
        {
            word_begin=temp;
        }
        if(word_begin && ((*(temp+1) == ' ') || (*(temp+1) == '\0')))
        {
            reverse(word_begin, temp);
            word_begin = NULL;
        }
        temp++;
    } /* End of while */

    /*STEP 2 of the above algorithm */
    reverse(s, temp-1);
}

我对这个问题的时间复杂性的理解:

1)迭代整个字符串O(n)n = length of the array

2)反向时间复杂度为O(m / 2) m = size of word reversing

为什么时间复杂度O(n * (m / 2))不是O(nm) ?

但链接中提到的时间复杂度为O(n)。为什么我们忽略了reverse method?

的时间复杂度

1 个答案:

答案 0 :(得分:0)

  

为什么时间复杂度O(n * (m / 2))不是O(nm)

因为每个每个字符都不会反转一个单词,所以每m个字符只能执行一次。因此,在浏览单词然后稍后反转时,会为您提供O(m)(两次m仍然是O(m)),整个过程需要n / m * O(m) = O(n) ,因为只有n/m个单词。

(更确切地说,对于单词长度m1m2,...,每个单词采用O(m_i)个步骤,以及s的总空白量,算法需要O(m1) + O(m2) + ... + O(s) = O(m1 + m2 + ... + s) = O(n),字长和总空白量总计为n。)