Algorithm 二进制堆中最小的元素?

Algorithm 二进制堆中最小的元素?,algorithm,computer-science,Algorithm,Computer Science,为什么在二进制堆中查找最小的事件需要O(logv)时间?(式中V为元件数量) 快速排序分治算法需要O(V)时间才能找到最小的元素。既然在二进制堆中查找最小的元素几乎与快速排序相同(每一步都将问题的大小除以2,并且问题的数量保持不变),为什么它们有不同的时间 为什么使用快速排序查找最小元素和在二进制堆中查找最小元素需要不同的时间?任何最小堆(不一定是二进制堆)都会在O(1)时间内为您提供最小的元素。这是因为最小的元素是堆的根(满足heap属性) 我认为这里的问题是你混淆了你的数据结构。在未排序列表

为什么在二进制堆中查找最小的事件需要O(logv)时间?(式中V为元件数量)

快速排序分治算法需要O(V)时间才能找到最小的元素。既然在二进制堆中查找最小的元素几乎与快速排序相同(每一步都将问题的大小除以2,并且问题的数量保持不变),为什么它们有不同的时间

为什么使用快速排序查找最小元素和在二进制堆中查找最小元素需要不同的时间?

任何最小堆(不一定是二进制堆)都会在
O(1)
时间内为您提供最小的元素。这是因为最小的元素是堆的根(满足heap属性)

我认为这里的问题是你混淆了你的数据结构。在未排序列表中任何算法都至少需要
O(N)
时间,其中N是元素数

如果您的数据已经存储在结构中,那么可以在
O(1)
时间内提取最小值。但是值得注意的是,首先从未排序的列表构造堆需要
O(N)
时间


如果您有一个排序列表,则可以使用二进制搜索在
O(logn)
时间中查找最小值。但同样,排序至少需要O(N)

假设您试图在max堆中找到最小的元素,它将需要O(V)时间,而不是O(log V)时间,如您所说。问题不是每一步都分成两半。因为,一旦确定它小于根,最小元素可以位于2个子树中的任何一个子树中。因此,您需要遍历这两个子树来查找min元素。

假设您所讨论的是基于枢轴的选择算法,它与快速排序非常类似,那么在这两种情况下查找min元素是完全不同的。我的意思是,基于快速排序的选择算法选择一个轴心并对元素进行分区,然后您就知道您要查找的剩余部分中的哪个部分。二进制堆没有类似的属性。堆的特殊属性是每个节点都比其父节点小(假设我们讨论的是最大堆)。正如其他答案之一所说,这限制了O(log(V))的可行候选数,因为这是一个二进制堆中可以有多少叶子。然而,(据我所知),您必须维护一个叶列表,或者必须将堆表示为一个数组,以便从中获得时间复杂性方面的好处。如果堆存储为一组链接节点,其中只有一个指向第一个元素的指针,那么在最坏的情况下,您必须搜索其所有子元素以找到最小值,因为这是查看叶子的唯一方法。我知道这个问题已经有了很多答案,其中大部分都是正确的,但我希望这能澄清一些事情


另外,需要明确的是,实际的快速排序算法(如果随机)在摊销O(nlogn)时间内运行。在排序的数组中找到最小的元素是O(1)。

修改您的假设。快速排序不会找到最小的元素(相反,它会进行排序,这是一个更大且完全不同的问题),并且不会在O(V)中运行(在最坏的情况下,我假设您没有得到更具体的结果)。二元堆为您提供了O(1)中最小的元素,假设您只检索它而不删除它(这需要重新排序以维护heap属性,而这一步需要O(log V)时间)。@delnan 1)二元堆将如何获得O(n)?它不需要先找到元素吗?二进制堆没有排序-父堆只是比子堆大。2) 对一组数字进行排序难道不能在O(1)时间内找到最小的元素吗?因为如果一个集合被排序,最小的数字就是最后一个数字(1),我假设一个最小的堆,它同样常见,并且对于这个用例来说更有效。唯一的区别是较小的元素放在顶部(即,您交换>以了解如何从未排序的列表构建二进制堆需要O(n)?不是至少需要O(n log n)是时候用Mergesort之类的算法对一组数字进行排序了?你又谈到了两件不同的事情。构造二进制堆与排序不是一回事。有关算法,请参阅。如果列表已排序,那么获取的最小值不应该是O(1),因为它只是第一个(或最后一个,取决于排序顺序)项吗?