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

Posted

技术标签:

【中文标题】关于代码片段的时间复杂度【英文标题】:About time complexity of the code snippet 【发布时间】:2018-08-29 21:55:34 【问题描述】:

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

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

例如:arr = [ 'p', 'e', 'r', 'f', 'e', 'c', 't', ' ', 'm', 'a', 'k', 'e', 's', '', 'p'、'r'、'a'、'c'、't'、'i'、'c'、'e']

输出:['p','r','a','c','t','i','c','e','', 'm', 'a', 'k', 'e', 's', '', 'p'、'e'、'r'、'f'、'e'、'c'、'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 提出了完全相同的方法,但认为它效率不高!

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

哪个是正确的?

【问题讨论】:

【参考方案1】:

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

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

实现对我来说有点傻;它更具可读性:

    将字母组连接成单词。 使用简单的列表切片反转单词顺序(包括空格)。 将单词扩展回字符。

【讨论】:

感谢您的回答。那么,您的意思是说我们俩都是正确的(就我们自己的定义而言)? 是的;他们在此类讨论中使用了适当的术语。你非常了解潜在的情况。就个人而言,我会与他们的技术作家快速聊天...... 哈哈。明白你的意思了。谢谢! :) 我会尽快接受答案。

以上是关于关于代码片段的时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段的算法复杂度

基于时间复杂度的这些片段真的很困惑

代码片段使用复杂的 JavaScript 在 UIWebView 中插入 HTML?

在Java中将字符串集合复制到另一个字符串的时间复杂度

PAT 乙级 1049 数列的片段和

PAT1049-----枚举法,找规律题,注意降低时间复杂度