这个功能的复杂性是什么?

时间:2016-01-01 22:08:24

标签: python algorithm performance

我在Codeacademy练习,我必须完成以下功能:

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

这是我的解决方案。

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

它运作良好,但我想知道函数的复杂性是什么。

我认为它是O(nk),其中n:=“文本长度”和k:=“长度”aeoiuAEIOU“”。我采用一个文本元素并将其与所有元音进行比较,需要O(k)时间。但是我重复了n次,所以我在O(nk)中完成了所有这些。我的分析是否正确?我怎么能改进我的功能?它可能是线性的吗?

2 个答案:

答案 0 :(得分:7)

Big-O复杂性并不像那样。 k(元音的长度)是一个常数,它不会根据输入的长度而改变。因此,我们在计算复杂性时将其折扣。

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

答案 1 :(得分:4)

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

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

因此,您的复杂性是:

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

我建议你阅读复杂性类的基本属性,特别是它们的总和,它们的乘积和乘法量是如何here