Database 从最大堆中提取的运行时间是多少?

Database 从最大堆中提取的运行时间是多少?,database,runtime,heap,performance,Database,Runtime,Heap,Performance,我有这个家庭作业问题 “James声称他成功地实现了从最大堆(ExtractMax)中提取,这需要O((log n)^0.5) 解释为什么詹姆斯错了 我知道从最大堆中提取需要O(logn),但我如何证明James是错的?可以看出,构建堆可以在O(n)中完成。现在,如果提取最大值可以在O((logn)^0.5)中完成,那么就可以在n*O((logn)^0.5)中对整个集合进行排序但是,这是不可能的,因为排序的下限是n*logn 因此,James的不存在。@Duh将提取问题转化为排序问题的解决方案实

我有这个家庭作业问题

“James声称他成功地实现了从最大堆(ExtractMax)中提取,这需要O((log n)^0.5)

解释为什么詹姆斯错了

我知道从最大堆中提取需要O(logn),但我如何证明James是错的?

可以看出,构建堆可以在O(n)中完成。现在,如果提取最大值可以在O((logn)^0.5)中完成,那么就可以在n*O((logn)^0.5)中对整个集合进行排序但是,这是不可能的,因为排序的下限是n*logn


因此,James的不存在。

@Duh将提取问题转化为排序问题的解决方案实际上是非常有创造性的。要找到排序是O(n*logn)的证据应该不太难,而且在算法研究中将一个问题转化为另一个问题是很常见的(例如,所有的NP完全问题都是彼此的转换。这就是你如何证明它们是NP完全的)。也就是说,我认为有一个更简单的解决方案

您在问题中直接说明了这一点:从二进制堆中提取是O(logn)。请思考为什么它是O(logn)。二进制堆的结构是什么?从二进制堆中提取需要哪些操作?为什么最坏的情况是logn操作?这些限制是否受实现的影响

现在,记住詹姆斯的主张有两部分:

  • 他可以在O中提取((对数n)^0.5)
  • 他正在使用二进制堆

  • 根据您对二进制堆的了解,这两种说法都是真的吗?为什么?为什么?是否存在矛盾?如果是,为什么存在矛盾?最后,想想这对James意味着什么。

    正确!只需稍加修改:比较排序的下限是n*logn。您可以按O(n)进行基数排序。这是一个非常聪明的方法,但我认为O(n)中的基数排序有点过分了?仅当您假定要排序的不同值的数目为常量时(例如2^32)。否则它是n*[表示长度],其中[表示长度]将是log(n)。