我不知道我在标题中使用的语言是否正确,但这里有一个例子说明我在问什么。
从字符串中删除字符对的非最优算法的时间复杂度是多少?
该函数将遍历一个字符串。当它找到彼此相邻的两个相同字符时,它将返回没有找到对的字符串。然后递归调用自己,直到找不到对。
示例(每行是来自一个重复函数调用的返回字符串):
iabccba
iabba
iaa
i
将时间复杂度描述为O(|Characters| * |Pairs|)
是否公平?
那么O(|Characters|^2)
即使在初始函数调用中无法知道对的数量,可以使用Can对来描述时间复杂度吗?
有人争辩说这个算法是O(n^2)
,因为对的数量是未知的。
答案 0 :(得分:1)
你说得对,严格来说是O(|Characters| * |Pairs|)
然而,在最坏情况中,对的数量可以与字符数相同(或相同的数量级),例如在字符串'abcdeedcba'中
因此,将其描述为O(n^2)
最坏情况也是有意义的。
我认为这很大程度上取决于你要解决的问题以及它的定义。
例如,对于图算法,每个人都习惯于将写作视为复杂性O(|V| + |E|)
,尽管最糟糕的情况是密集图|E| = |V|^2
。在其他问题中,我们只看最糟糕的情况并编写O(n^2)
,而不将其分解为更具体的变量。
我想说如果没有特殊约定,或者关于对数的问题没有特殊数据,O(...)
意味着最坏情况的表现,因此O(n^2)
会更合适。