最近,我和同事就一段非常简单的算法的运行时复杂度进行了一场激烈的辩论。最终我们都认为自己是对的,但我一直在思考这个问题,这挑战了我对计算机科学基础的理解,因此我需要进一步了解这个问题。
假如给出以下Python代码,请问它的大O运行时复杂度是多少:
for c in "How are you today?":
print c
现在,我立即指出这只是O(n)即线性级别。这意味着它取决于字符串的长度,因此随着字符串长度的增加,该循环将呈线性增长。
我的同事接着说:“不,它是常数,因为我们知道对于所有字符串集合(在我们的情况下),最大字符串长度始终为255个字符(在我们的情况下),因此它必须是常数。”他接着说:“因为我们对字符串的最大上限长度有一个上限,这导致O(255),这可以简化为O(1)。”
无论如何,我们来回争论了45分钟,经过我们两人画草图后,我们都陷入了僵局。
我的问题是,在哪个世界或哪种数学系统中,上面的循环是一个常数时间循环?如果我们知道我们的上限是100万个字符,并且所有字符串集合的大小可以从0到100万不等,那么这个循环显然会根据字符串的大小而呈现线性运行时间。
我还问他,如果已知n的上限大小,则以下代码是否也是O(1)。这意味着我们确定此代码仅对最大上限为255个字符的字符串进行操作。
s = "How are you today?"
for c in s:
for d in s:
print c+d
他说即使我解释这是一个O(n^2)算法,并证明以下代码会产生二次曲线,这也是恒定的时间...。
那么,我是不是缺少了一些理论概念,任何上述内容都取决于理论如何进行?需要明确的是,他的理解是如果n未知,则我的观点是正确的。如果n的上限总是已知的,则他断言此帖子中的两个算法都具有恒定的运行时间复杂度。
只是想保持清醒,但也许如果我错了,肯定还有一些额外的学习可以获益。我的好同事非常有说服力。此外,如果有人对这个问题有特定的链接或材料,请添加到评论中。