【问题标题】:Naive Suffix Array time complexity朴素后缀数组时间复杂度
【发布时间】: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


【解决方案1】:

您似乎混淆了摊销复杂性和预期复杂性。在这种情况下,您正在谈论预期的复杂性。是的,假设后缀比较采用O(n),计算所述复杂性。这将是后缀比较的最坏情况,对于随机生成的输入,在大多数情况下您只会执行恒定数量的比较。因此O(n^2*log(n)) 是最坏情况下的复杂度。

另外一点 - 在现代计算机上,您可以在一秒钟内执行几 十亿 条基本指令,并且您有可能在 2 秒内执行大约 50000^2 条指令。衡量算法复杂性的正确方法是测量完成所需的时间,例如输入大小为N, N*2, N*4,...(as many as you can go),然后插入描述计算复杂度的函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2014-05-01
    相关资源
    最近更新 更多