【发布时间】:2020-04-28 16:10:31
【问题描述】:
在有n个元素的最小堆中,最小的元素在根,可以及时找到第7小的元素。
- Θ(nlogn)
- Θ(n)
- Θ(logn)
- Θ(1)
我的理解: 在最小堆检索操作中找到最小元素的时间 - Θ(1) 在最小堆上找到第二小的元素的时间需要 22−1 = 3 次检查操作来找到 3 个元素中的第二小元素 - Θ(1)。
找到第 7 个最小元素的时间 - 需要 O(27−1) = O(127) 个检查操作才能在 127 个可能的元素中找到第 7 个最小元素 - Θ(1)。
简而言之,如果所需操作的数量与输入大小 n 无关,那么它总是 Θ(1)。 (在这里,我们正在对堆进行级别顺序遍历并检查元素)。
或者我也可以这样看:如果我们不允许遍历堆并且只允许默认的堆操作,我们将被限制执行 Extract-min 7 次,这将是 O(n)。
我的疑问是哪种方法是正确的,应该是什么答案。
【问题讨论】:
-
是否要在不修改堆的情况下找到项目?还是可以只删除最少的项目七次?
-
数据是否封装不可访问?如果您可以直接检查底层数组,您可以在不改变堆的情况下直接看到常数时间的前 127 个元素,而 Matt Timmermans 的答案应该是正确的。请记住,大 O 是关于问题如何作为 n 的函数进行扩展,而不是关于给定 n 需要多长时间,因此即使常数很大,也会被忽略。