写大O符号时可以使用未知变量吗?

时间:2017-03-10 22:52:08

标签: time-complexity big-o

我不知道我在标题中使用的语言是否正确,但这里有一个例子说明我在问什么。

从字符串中删除字符对的非最优算法的时间复杂度是多少?

该函数将遍历一个字符串。当它找到彼此相邻的两个相同字符时,它将返回没有找到对的字符串。然后递归调用自己,直到找不到对。

示例(每行是来自一个重复函数调用的返回字符串):

iabccba
iabba
iaa
i

将时间复杂度描述为O(|Characters| * |Pairs|)是否公平? 那么O(|Characters|^2)即使在初始函数调用中无法知道对的数量,可以使用Can对来描述时间复杂度吗?

有人争辩说这个算法是O(n^2),因为对的数量是未知的。

1 个答案:

答案 0 :(得分:1)

你说得对,严格来说是O(|Characters| * |Pairs|)

然而,在最坏情况中,对的数量可以与字符数相同(或相同的数量级),例如在字符串'abcdeedcba'中 因此,将其描述为O(n^2)最坏情况也是有意义的。

我认为这很大程度上取决于你要解决的问题以及它的定义。 例如,对于图算法,每个人都习惯于将写作视为复杂性O(|V| + |E|),尽管最糟糕的情况是密集图|E| = |V|^2。在其他问题中,我们只看最糟糕的情况并编写O(n^2),而不将其分解为更具体的变量。

我想说如果没有特殊约定,或者关于对数的问题没有特殊数据,O(...)意味着最坏情况的表现,因此O(n^2)会更合适。