【问题标题】:How can we prove that the running time bound of an algorithm is tight?我们如何证明算法的运行时间限制是紧的?
【发布时间】:2015-07-04 20:36:48
【问题描述】:

假设我们可以证明,使用大小为 n 的输入调用的算法可以及时运行 O(f(n))

我想证明这个运行时间限制很紧。两个问题:

  1. 提供一个特殊的输入并显示运行时间至少是f(n) 不够吗?
  2. 我已经读到证明紧密性的一种可能性是“减少对它的排序”。我不知道这是什么意思

【问题讨论】:

    标签: algorithm big-o computer-science big-theta


    【解决方案1】:

    提供一个特殊的输入并显示正在运行的 时间至少为 f(n)?

    是的,假设您谈论的是最坏情况的复杂性
    如果您正在谈论最坏情况的复杂性 - 并且您已经证明它在 O(f(n)) 中运行,如果您发现某个输入比 C*f(n)) 更“差”对于某个常量 C - 您有效地证明了该算法(在最坏情况下的性能)在Ω(f(n)),并且由于O(f(n)) [intersection] Ω(f(n)) = Theta(f(n)),这意味着您的算法在最坏情况分析下运行在Theta(f(n))
    注意它实际上应该是一个“系列”示例,因为如果我声明“是的,但这仅适用于小的 n 值,而不适用于 n>N(对于一些N),你可以告诉我这一系列的例子也涵盖了n>N的情况,并且仍然有效。

    对称地,如果你证明了一个算法具有Ω(f(n)) 的最佳案例性能,并且你发现一些输入对于某些常数C 运行“更好”(更快)(更快),那么你有效地证明了该算法是@ 987654334@最佳案例分析下。


    此技巧不适用于平均案例分析 - 您应该计算运行时间的预期值,而单个示例没有帮助。

    我读到证明密封性的一种可能性是“减少 排序到它”。我不知道这是什么意思

    这样做是为了证明一个更强有力的主张,即没有算法(根本)可以在所需的时间解决某些问题
    它的常见用法是假设有一些黑盒算法A 在某个o(g(n)) 时间运行,然后使用A 构建一个在o(nlogn) 时间运行的排序算法。但是,由于排序是Ω(nlogn) 的问题,我们有一个矛盾,我们可以断定关于A 的假设是错误的,它不能在预期的时间内运行。

    这有助于我们证明一个更有力的主张:不仅我们的算法有这个下限,解决特定问题的所有算法都有这个下限。

    【讨论】:

    • 所以,我需要证明我的算法解决的问题,相当于数据排序问题,对吧?
    • @0xbadf00d 不完全是,你可以证明你可以在 o(nlogn) 时间内解决排序问题。
    【解决方案2】:

    ad 1.: 是的,但是你必须能够为任何 n 找到大小为 n 的输入。分 9 步处理的大小 3 的示例并不能真正证明什么。

    ad 2.:如果您可以修改元素序列,以便您的算法有效地对其进行排序(在对输出进行一些处理后得到一个排序序列),那么您已经减少了对它的排序。而且因为排序(通过比较)不能比 O(n log(n)) 快,这可以用来证明你的算法不能比 O(n log(n)) 快。

    当然,输入和输出处理函数不能慢于或等于 O(n log(n)) 才能使该参数有效,否则您可以对数组进行排序并证明 O(1) 算法只是返回输入数组实际上至少是 O(n log(n)) :)。

    【讨论】:

    • 大约 1:任何n 都不需要。足以证明所有足够大的n 都有这样的输入。
    猜你喜欢
    • 1970-01-01
    • 2017-12-28
    • 2019-04-20
    • 2019-10-11
    • 2021-11-08
    • 1970-01-01
    • 2019-07-19
    • 2015-06-26
    相关资源
    最近更新 更多