【问题标题】:What is the Big-O of this function that reverses words in a string这个反转字符串中单词的函数的大 O 是什么
【发布时间】:2015-06-22 20:49:22
【问题描述】:

我有一个简单的函数 reverseWords(),它可以修改字符串中的单词。例如。 S = "this is a string" 的输入给出了 "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) 因为...我忘了解释

【问题讨论】:

标签: python big-o time-complexity


【解决方案1】:

它是O(N)。我假设您不确定的部分是:

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

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

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

  • 扫描它以查找split() 中的单词边界
  • 将其复制到split() 中的新字符串中
  • 将该新字符串附加到结果列表中(实际上,我们对每个字符执行此操作的次数少于一次,但对于 big-O 来说,上限很好)
  • listA 上推进迭代器(同样,少于一次,每个单词只有一次)
  • 以相反的顺序将其复制到切片中的新字符串中。
  • 将其包含的字符串附加到output(每个单词一次)
  • 无论 join() 做什么(如果你在乎,我邀请你调查一下,或者相信我的话,它是 O(total length of all strings))。

因此,如果列表追加、内存分配等都被摊销了O(1),在 CPython 中就是这样,那么总体时间复杂度是O(N),包括join()

由于正确的术语很重要,因为它是O(N),因此它也是O(N^2)

【讨论】:

    猜你喜欢
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    相关资源
    最近更新 更多