我在Java中实现了splay树(插入,搜索,删除操作)。现在我想检查算法的复杂性是否为O(logn)。有没有办法通过改变输入值(节点数)和以秒为单位检查运行时间来检查这一点?比如说,通过输入1000,100000这样的输入值并检查运行时间还是有其他方法吗?
答案 0 :(得分:0)
严格地说,通过为n
的某些值运行算法,您无法找到算法的时间复杂度。我们假设您已为值n_1, n_2, ..., n_k
运行它。如果算法对任何较大的n^2
值的任何n <= max(n_1, ..., n_k)
和10^100
操作进行n
次操作,则它具有恒定的时间复杂度,即使它看起来像来自你所拥有的点的二次方。
但是,您可以通过运行来评估在大小为n
的输入上完成所需的操作数量(我甚至不会将其称为时间复杂度,因为后者具有严格的正式定义)对某些n
值并查看比率T(n1) / T(n2)
和n1 / n2
。但即使在“真实”算法的情况下(在某种意义上它不是第一段中描述的病态情况),您应该小心输入的“结构”(例如,快速排序算法,对于随机输入,第一个元素作为枢轴在O(n log n)
平均运行,因此如果生成不同大小的随机数组,它将看起来像O(n log n)
。但是,它在O(n^2)
时间内运行反向排序的数组)。
总结一下,如果你需要从实际的角度来看它是否足够快并且你知道算法的典型输入是什么样的,你可以尝试生成不同大小的输入并看看如何执行时间越来越长。
但是,如果您需要在数学意义上对运行时进行绑定,则需要以数学方式证明算法的某些属性和边界。
在你的情况下,我会说对随机输入进行测试可能是一个合理的想法(因为有一个数学证明,一个操作的时间复杂度对于一个splay树来说是O(log n)
,所以你只需要检查您实现的树确实是一个正确的splay树。一个注意事项:我建议尝试不同的查询模式(比如以排序/反向顺序插入元素等),因为即使输入是“随机”的,非均衡树也能很快地工作。