写big O notation时可以使用未知变量吗?

When writing big O notation can unknown variables be used?

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

这个从字符串中删除字符对的 non-optimal 算法的时间复杂度是多少?

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

示例(每一行都是来自一个递归函数调用的 return 字符串):

iabccba
iabba
iaa
i

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

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

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

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

我认为这在很大程度上取决于您要解决的问题及其定义。 例如,对于图算法,每个人都可以接受复杂度 O(|V| + |E|) 的写作,尽管在密集图的最坏情况下 |E| = |V|^2。在其他问题中,我们只考虑最坏的情况并写成 O(n^2),而没有将其分解为更具体的变量。

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