这个函数的Big-O是什么,可以反转字符串中的单词

时间:2015-06-22 20:49:22

标签: python big-o time-complexity

我有一个简单的函数,reverseWords(),它隐藏了字符串中的单词。例如。输入S =“这是一个字符串”给出“siht si a gnirts”的输出

我想知道这个功能的大O是什么。是O(N),O(N ^ 2)还是O(N * M)?

def reverseWords(S):
    # code in Python 2.7
    listA = S.split()
    output = []
    for element in listA:
        output.append(element[::-1])

    return (" ".join(output))

是O(N),O(N ^ 2)还是O(N * M)?

  • O(N ^ 2),因为我们有一个嵌套循环,例如。传递一次输入,外部循环,然后将每个字符反转为内部循环
  • O(N * M)与上述相同的原因,除了M表示为字符上的循环
  • O(N)因为...我忘记了解释

1 个答案:

答案 0 :(得分:5)

它是O(N)。我认为你不确定的部分是:

for element in listA:
    output.append(element[::-1])

这里需要注意的是,虽然我们确实有嵌套循环(超过listA及其每个元素中的字符),但处理的字符总数仍然只有O(N)。如果k是每个单词中的平均字母数,那么您可以将时间视为N/k(对于外循环)* k(对于内循环)= {{ 1}}。

更直接(我说更好)分析它的方法是思考,"我需要为每个角色做什么"?:

  • 扫描它,在N
  • 中查找字边界
  • 将其复制到split()
  • 中的新字符串
  • 将新字符串附加到结果列表中(实际上我们每个字符执行此操作不到一次,但对于big-O,上限是正常的)
  • 将迭代器推进split()(再次,不到一次,每个单词只有一次)
  • 以相反的顺序将其复制到切片中的新字符串中。
  • 将其包含的字符串附加到listA(每个单词一次)
  • 无论output做什么(如果您愿意,我邀请您进行调查,或者接受我的话join())。

因此,如果列表追加,内存分配等等都是分摊的O(total length of all strings),在CPython中它们是,那么整体时间复杂度为O(1),包括O(N)

因为正确的术语很重要,因为它join()因此O(N)也是如此。