关于代码片段的时间复杂性

时间:2018-03-20 22:28:02

标签: python algorithm time-complexity

我正在尝试解决Pramp上的问题:

  

实现一个函数reverseWords,以最有效的方式反转数组中单词的顺序。

     

例如:arr = [' p',' e'' r',' f',' e&# 39;,' c',' t',' &#39 ;,                   ' m'' a',''' e'' s',' &#39 ;,                   ''' r',' a',' c',' t',' i& #39;,' c',' e' ]

     

输出:[' p',' r',' a',' c',' t' ,'我' c',' e',' &#39 ;,             ' m'' a',''' e'' s',' &#39 ;,             ' p','''' f',' e',' c& #39;,' t' ]

他们给出的类似Python的伪代码如下:

function reverseWords(arr):
    # reverse all characters:
    n = arr.length
    mirrorReverse(arr, 0, n-1)

    # reverse each word:
    wordStart = null
    for i from 0 to n-1:
        if (arr[i] == ' '):
            if (wordStart != null):
                mirrorReverse(arr, wordStart, i-1)
                wordStart = null
        else if (i == n-1):
            if (wordStart != null):
                mirrorReverse(arr, wordStart, i)
        else:
            if (wordStart == null):
                wordStart = i

    return arr


# helper function - reverses the order of items in arr
# please note that this is language dependent:
# if are arrays sent by value, reversing should be done in place

function mirrorReverse(arr, start, end):
    tmp = null
    while (start < end):
        tmp = arr[start]
        arr[start] = arr[end]
        arr[end] = tmp
        start++
        end--

他们说时间复杂度是 O(n),主要是因为他们遍历数组两次,每个项目的操作数量恒定。顺便提一下,我在C ++中使用stringstreams提出了完全相同的方法,但认为它效率不高!

我认为此代码段的时间复杂度应为 O(mn),其中m是字符串中的字数,n是平均字符数每个单词都有字母。之所以如此,是因为我们遍历输入中的所有元素,在最坏的情况下,对于给定的mirrorReverse()i再次访问所有元素以进行反转。

有人可以解释一下吗?谢谢!

2 个答案:

答案 0 :(得分:2)

O(n)中,n表示输入的长度(总字符数),而不是单词数量。我怀疑你很困惑因为代码在后一种意义上使用变量n

请注意解释:“遍历数组......”。 “数组”由单个字符组成。

实施对我来说似乎有点傻;它的可读性更高:

  1. 将字母组加入文字。
  2. 使用一个简单的列表切片反转单词顺序(包括空格)。
  3. 将字词扩展回字符。

答案 1 :(得分:-1)

那么,当你获得 O(m * n)时会发生什么?由于 n 无限大, m 部分真的重要吗?大多数算法要复杂得多,并且可以有 O(n + 2log3 * 7n)等等,但这会简化为 O(n ^ 2)因为 n 变得无限大, 2log3 7 * n 并不重要。只有 n * n