为什么在二进制堆中查找最小事件需要O(log V)时间? (其中V是元素的数量)
Quicksort分而治之算法花费O(V)时间来找到最小元素。由于找到二进制堆中的最小元素几乎与Quicksort相同(每个步骤将问题的大小除以2,问题的数量保持不变)为什么它们有不同的时间?
为什么使用Quicksort查找最小元素并找到二进制堆中的最小元素需要不同的时间?
答案 0 :(得分:2)
任何最小堆(不一定是二进制)都会在O(1)
时间内为您提供最小的元素。这是因为最小的元素是堆的根(满足堆属性)。
我认为这里的问题是你的数据结构混乱。在未排序列表中,任何算法都至少需要O(N)
次,其中N是元素数。
如果您的数据已存储在堆结构中,则可以在O(1)
时间内提取最小值。但是值得注意的是,从未排序列表中首先构建堆将花费O(N)
时间。
如果您有排序列表,则可以使用二进制搜索在O(log N)
时间内找到最小值。但同样,排序至少需要O(N)
。
答案 1 :(得分:0)
假设您正在尝试查找最大堆中的最小元素,则需要O(V)时间,而不是O(log V)时间,如您所述。问题在每一步都没有分成两半。因为,一旦你建立它小于根,最小元素可以在2个子发辫中的任何一个。因此,您需要遍历两个子树以查找min元素。
答案 2 :(得分:0)
假设您正在谈论与快速排序非常相似的基于枢轴的选择算法,那么在两种情况下找到min都是根本不同的。我的意思是基于快速排序的选择算法选择一个数据透视并对你的元素进行分区,然后你知道你要查找的数字中剩下的哪个段。二进制堆没有类似的属性。堆的特殊属性是每个节点都小于它的父节点(假设我们正在讨论最大堆)。就像其他一个答案所说的那样,这限制了O(log(V))的可行候选数量,因为这可以在二进制堆中有多少叶子。但是,(据我所知)您必须维护一个叶子列表,或者您的堆必须表示为一个数组,以便您从中获得时间复杂性的好处。如果你的堆存储为一组链接节点,它们只有一个指向第一个元素的指针,那么在最坏的情况下,你必须搜索它的所有子节点才能找到最小值,只要因为这是你能看到它的唯一方法。树叶。我知道这个问题已经有了很多答案,其中大多数都是正确的,但我希望这能澄清一些事情。
另外,为了清楚起见,实际的快速排序排序算法(如果是随机的)以摊销的O(nlogn)时间运行。找到排序数组中的最小元素是O(1)。