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

标签 python big-o time-complexity

我有一个简单的函数 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) 因为...我忘了解释

最佳答案

它是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(所有字符串的总长度))。

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

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

关于python - 这个函数的大 O 是什么,可以反转字符串中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30989560/

相关文章:

python - 如何在pandas.read_csv的 header 之前跳过未知数量的空行?

python - 如何统计数字的总设置位数

python - 有什么不能出现在括号内的吗?

algorithm - 在 O(n) 时间内确定序列 T 是否是序列 S 的排序

algorithm - 如何确定这个算法的时间复杂度?

python - 光GBM : validation AUC score during model fit differs from manual testing AUC score for same test set

algorithm - 寻找离散对数的时间复杂度(蛮力)

algorithm - 对数大 O 与平方根

java - 确定 while 循环的迭代次数

算法复杂度时间