【发布时间】:2015-07-04 20:36:48
【问题描述】:
假设我们可以证明,使用大小为 n 的输入调用的算法可以及时运行 O(f(n))。
我想证明这个运行时间限制很紧。两个问题:
- 提供一个特殊的输入并显示运行时间至少是
f(n)不够吗? - 我已经读到证明紧密性的一种可能性是“减少对它的排序”。我不知道这是什么意思
【问题讨论】:
标签: algorithm big-o computer-science big-theta
假设我们可以证明,使用大小为 n 的输入调用的算法可以及时运行 O(f(n))。
我想证明这个运行时间限制很紧。两个问题:
f(n) 不够吗?【问题讨论】:
标签: algorithm big-o computer-science big-theta
提供一个特殊的输入并显示正在运行的 时间至少为 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 的假设是错误的,它不能在预期的时间内运行。
这有助于我们证明一个更有力的主张:不仅我们的算法有这个下限,解决特定问题的所有算法都有这个下限。
【讨论】:
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)) :)。
【讨论】:
n 都不需要。足以证明所有足够大的n 都有这样的输入。