我试图在Suffix Arrays上发明编程练习。我学习了O(n*log(n)^2)
算法来构造它,然后开始玩不同长度的随机输入字符串,以便找出naive
方法变得太慢的时间。例如。我想选择字符串长度,以便人们需要实现" advanced"算法
突然我发现naive
算法(对所有后缀使用对数排序)并不像O(n^2 * log(n))
那样慢。在稍微思考之后,我理解随机生成的字符串的后缀的比较不是O(n)
摊销的。实际上,我们通常只是在差异之前比较几个第一个字符,然后我们从比较函数返回。这当然取决于字母表的大小,但无论如何它并不太依赖于后缀的长度。
我在PHP处理中尝试了简单的实现50000
- 2
秒内的字符串(尽管脚本语言很慢)。如果它至少可以工作O(n^2)
,我们预计它至少可以运行几分钟(每秒运行1e7次,总共运行〜1e9次)。
所以我明白,即使它是O(n^2 * log(n))
,那么常数因子只是1的一小部分,实际上接近于0.或者我们应该只说worst-case
这样的复杂性,对吧?
但天真方法的摊销时间复杂度是多少?我对如何评估它感到困惑。
答案 0 :(得分:0)
您似乎混淆了摊销和预期的复杂性。在这种情况下,您谈论的是预期的复杂性。是的,假设后缀比较为O(n)
,则计算所述复杂度。对于后缀比较,这将是最坏的情况,对于随机生成的输入,在大多数情况下,您只会执行恒定数量的比较。因此O(n^2*log(n))
是最糟糕的案例复杂性。
还有一个注意事项 - 在现代计算机上,您可以在一秒钟内执行一些十亿次基本指令,并且您可能会在2秒内以50000 ^ 2的顺序执行。对算法的复杂性进行基准测试的正确方法是测量完成算法所需的时间。输入大小为N, N*2, N*4,...(as many as you can go)
,然后插入描述计算复杂度的函数