您将获得一个字符串,例如"acdfdcqqc"
并且需要创建一个算法来查找最大的回文子字符串,在我们的例子"cdfdc"
中。通过创建一个大小为2n的数组并且每次计算最大回文的长度以及该点的中心即可以很容易地设计O(n ^ 2)算法,即:
a - c - d - f - d - c - q - q - c
1 0 1 0 1 0 5 0 1 0 1 0 1 4 1 0 1
对于2n个可能起点中的每一个,我在两个方向上移动,找到从该位置开始的最大回文的长度。因此,对于我在大多数O(n)操作中执行的每个2n操作,因此O(n ^ 2)时间复杂度。
我知道可以使用更高级的算法在线性时间内完成:https://en.wikipedia.org/wiki/Longest_palindromic_substring。
但假设我们处理的字符串是从自然英文文本中提取的。如果我们在英文文本中随机选择一个位置,那么我们可能期望找到的预期对称性非常低。我甚至会说,预期的对称性在每一方都不到一个字符。 因此,我可以说我的算法正在进行2n次预期的恒定时间操作,使得算法平均值为O(n)吗?
答案 0 :(得分:5)
没有
在算法设计中,假设算法在预期的O(n)
时间内运行意味着它为每个可能的输入执行。也就是说,期望应该是算法的随机性(内部硬币翻转),而不是从限制集中随机均匀地选择输入的事实。
然而,这并不代表你的算法不好。可以使用输入仅限于英文文本的事实,因此具有某些属性使得算法比一般输入更快。但是,您使用的术语(预期O(n)
时间)保留给每个输入的运行时间预计为O(n)
的算法。
答案 1 :(得分:2)
算法的预期运行时间是算法在所有可能输入上的平均运行时间。 (参见CLRS的第5章。)正如教科书所指出的那样,解决这个问题并不总是很容易,有时候使用另一种选择是有用的:算法在随机选择的运行时间输入。但原理是相同的:“预期运行时间”的概念是概率,并且只适用于聚合算法的大量应用。
相比之下,“最坏情况运行时间”是算法在任何输入(每个长度)上的最差运行时间。这也不总是很容易计算,但是它适用于最小上限计算,这在big-O表示法的情况下很好,因为O(f(n))只表示f(n)是上限 - 界。
如果在一组受限制的输入上应用算法,则可以指定该受限集上的预期或最坏情况运行时间;如果输入在可能的输入范围内不均匀分布,则应在计算预期运行时间时将其考虑在内。
在回文长度的情况下,如果输入是随机选择的英文文本的子串,则最大回文的预期长度将(略微)长于从文本中随机选择的文本的最大回文的预期长度。字符串的整个世界,其字符是从小写字母和空格字符集中绘制的。但是对于这两组输入,最长回文的预期长度是O(1)。
所以可以说你的算法是“期望的O(n)”,尽管你还应该指定输入字符串范围的性质。但是如果你无法控制算法的输入,那么最坏情况的运行时间也是相关的,因为很容易为你的天真算法设计最坏情况的输入,所以对它的DoS攻击显然是可行的。