我在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)
中完成了所有这些。我的分析是否正确?我怎么能改进我的功能?它可能是线性的吗?
答案 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。