【问题标题】:checking the complexity of splay tree operation in java检查java中splay树操作的复杂性
【发布时间】:2016-11-11 06:38:13
【问题描述】:

我已经在 J​​ava 中实现了展开树(插入、搜索、删除操作)。现在我想检查算法的复杂度是否为 O(logn)。有没有办法通过改变输入值(节点数)并以秒为单位检查运行时间来检查这一点?比如说,通过输入 1000、100000 等输入值并检查运行时间还是有其他方法?

【问题讨论】:

标签: java algorithm time-complexity binary-search-tree


【解决方案1】:

严格来说,您无法通过对n 的某些值运行算法来找到算法的时间复杂度。假设您已经为值n_1, n_2, ..., n_k 运行它。如果该算法对任何n <= max(n_1, ..., n_k) 进行n^2 操作,并且对n 的任何较大值进行准确的10^100 操作,它具有恒定的时间复杂度,即使它看起来像你所拥有的点的二次方。

但是,您可以通过在一些n 的值并查看比率 T(n1) / T(n2)n1 / n2。但即使是“真实”算法(从某种意义上说,它不是第一段中描述的病态情况),您也应该小心输入的“结构”(例如,快速排序算法采用对于随机输入,作为枢轴的第一个元素平均在O(n log n) 中运行,因此如果您生成不同大小的随机数组,它看起来像O(n log n)。但是,对于反向排序的数组,它在O(n^2) 时间内运行)。

总而言之,如果您需要从实际的角度确定它是否足够快,并且您知道算法的典型输入是什么样的,您可以尝试生成不同大小的输入,看看效果如何执行时间变长了。

但是,如果您需要数学意义上的运行时界限,则需要在数学上证明算法的一些属性和界限。

在您的情况下,我会说对随机输入进行测试可能是一个合理的想法(因为有一个数学证明,对于展开树,一个操作的时间复杂度是 O(log n)),所以您只需要检查您实现的树确实是正确的展开树。注意事项:我建议尝试不同的查询模式(例如以排序/反向顺序插入元素等),因为只要输入是“随机的”,即使不平衡的树也可以很快工作。

【讨论】:

    猜你喜欢
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    相关资源
    最近更新 更多