【发布时间】:2015-08-13 09:36:59
【问题描述】:
我正在尝试在Suffix Arrays 上发明编程练习。我学习了O(n*log(n)^2) 构造它的算法,然后开始使用不同长度的随机输入字符串来找出naive 方法何时变得太慢。例如。我想选择字符串长度,以便人们需要实现“高级”算法。
突然我发现naive 算法(对所有后缀使用对数排序)并不像O(n^2 * log(n)) 的意思那么慢。想了想,我明白随机生成的字符串的后缀比较不是O(n) 摊销的。实际上,我们通常只比较几个第一个字符,然后再进行比较,然后从比较函数返回。这当然取决于字母表的大小,但无论如何它并不取决于后缀的长度。
我在 PHP 处理 50000-characters 字符串中尝试了简单的实现 2 秒(尽管脚本语言很慢)。如果它至少能像 O(n^2) 一样工作,我们预计它至少能工作几分钟(每秒 1e7 次操作,总共约 1e9 次操作)。
所以我知道即使是O(n^2 * log(n)),常数因子也只是 1 的一小部分,实际上接近于 0。或者我们应该只说像 worst-case 这样的复杂性,对吧?
但是天真的方法的摊销时间复杂度是多少?我对如何评估它感到有些困惑。
【问题讨论】:
-
如果你的字符串完全由同一个字符组成怎么办?
-
是的,你看我说过
O(n)用于后缀比较是worst-case...但是通常我们不会索引这样的字符串(除非在编程比赛中,哈哈)。
标签: string algorithm complexity-theory