我遇到了这篇文章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?
答案 0 :(得分:0)
为什么时间复杂度
O(n * (m / 2))
不是O(nm)
?
因为每个每个字符都不会反转一个单词,所以每m
个字符只能执行一次。因此,在浏览单词然后稍后反转时,会为您提供O(m)
(两次m
仍然是O(m)
),整个过程需要n / m * O(m)
= O(n)
,因为只有n/m
个单词。
(更确切地说,对于单词长度m1
,m2
,...,每个单词采用O(m_i)
个步骤,以及s
的总空白量,算法需要O(m1) + O(m2) + ... + O(s) = O(m1 + m2 + ... + s) = O(n)
,字长和总空白量总计为n
。)