【问题标题】:What's the complexity of this function?这个函数的复杂度是多少?
【发布时间】:2016-01-01 22:08:24
【问题描述】:

我在 Codeacademy 练习,我必须做以下函数:

定义一个名为 anti_vowel 的函数,它将一个字符串文本作为输入并返回删除所有元音的文本

这是我的解决方案。

def anti_vowel(text):
md = ""
for ch in text:
    if ch not in "aeiouAEIOU":
        md =  md + ch
return md 

它运作良好,但我想知道这个功能的复杂性是什么。

我认为是 O(nk) 其中 n:="length of text" 和 k:="length of "aeoiuAEIOU""。
我取一个文本元素并将其与所有元音进行比较,这需要 O( k) 时间。但是我重复了 n 次,所以我在O(nk) 中完成了所有操作。我的分析正确吗?我怎样才能改善我的功能?可以是线性的吗?

【问题讨论】:

  • 请注意,您的缩进不正确,如图所示。我认为你的实际代码是正确的。

标签: python algorithm performance


【解决方案1】:

Big-O 复杂性不是这样工作的。 k(元音的长度)是一个常数,它不会根据输入的长度而改变。所以我们在计算复杂度时不考虑它。

你的函数只是 O(n),即线性复杂度。

【讨论】:

    【解决方案2】:

    你是对的,你的函数的复杂度是O(nk)。你错过的是 O(nk) 等于 O(n) 如果 k 是一个不等于零的常数。这意味着您的函数已经在线性时间内运行。

    您正在使用 n 字符迭代字符串 text。 每次迭代,您检查当前字符是否在 固定 长度 k 的字符串中(k 是一个常量!)。在最坏的情况下,此检查将采取k 步骤。

    因此,您的复杂性是:

    O(k)O(n) = O(kn) = O(n)

    我建议您阅读复杂性类的基本属性,特别是它们的总和、它们的乘积和乘以常数的工作原理here。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-03
      • 2017-09-11
      • 2019-06-08
      • 2011-08-07
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多