关于代码片段的时间复杂度
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
。
注意解释:“遍历数组...”。 “数组”由单个字符组成。
实现对我来说有点傻;它更具可读性:
-
将字母组连接成单词。
使用简单的列表切片反转单词顺序(包括空格)。
将单词扩展回字符。
【讨论】:
感谢您的回答。那么,您的意思是说我们俩都是正确的(就我们自己的定义而言)? 是的;他们在此类讨论中使用了适当的术语。你非常了解潜在的情况。就个人而言,我会与他们的技术作家快速聊天...... 哈哈。明白你的意思了。谢谢! :) 我会尽快接受答案。以上是关于关于代码片段的时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章