Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 堆排序复杂性_Algorithm_Heap_Asymptotic Complexity_Heapsort - Fatal编程技术网

Algorithm 堆排序复杂性

Algorithm 堆排序复杂性,algorithm,heap,asymptotic-complexity,heapsort,Algorithm,Heap,Asymptotic Complexity,Heapsort,下面是数组上HEAPSORT的伪代码 HEAPSORT(A) BUILD-MAX-HEAP(A) for i = A.length downto 2 exchange A[1] with A[i] A.heapsize = A.heapsize - 1 MAX-HEAPIFY(A,1) 我很清楚,BUILD-MAX-HEAP的复杂度为O(n),MAX-HEAPIFY的复杂度为O(h),其中h是最大值为logn的堆的高度 我不完全理解的是,为什么HeapSo

下面是数组上HEAPSORT的伪代码

HEAPSORT(A)
  BUILD-MAX-HEAP(A)
  for i = A.length downto 2
     exchange A[1] with A[i]
     A.heapsize = A.heapsize - 1
     MAX-HEAPIFY(A,1)
我很清楚,BUILD-MAX-HEAP的复杂度为O(n),MAX-HEAPIFY的复杂度为O(h),其中h是最大值为logn的堆的高度

我不完全理解的是,为什么HeapSort具有nlogn的复杂性。我知道我们有n个迭代,每个迭代都有一个MAX-HEAPIFY。但是,在每次迭代中,MAX-HEAPIFY调用都会得到一个不断减小的堆。那么,每个迭代的复杂度怎么可能是O(lgn)?绑得紧吗?在任何地方我都能看到相同的数学证明?

大O符号表示上限。正如你所说:

MAX-HEAPIFY的复杂度为O(h),其中h是最大值为log n的堆的高度

我们不在乎堆是否变小。我们知道,在最坏的情况下,堆的高度为logn。我们这样做n次,因此n log n.

观察

log 1 + log 2 + log 3 + ... + log n
= log (1 * 2 * 3 * ... * n)
= log n!
现在,根据斯特林近似

n! ≈ sqrt(2πn) * (n/e)n

这是O(n log n),因为
n log n
项支配
n
项(而我忽略了O(log n)项,因为没有MathJax很难输入)。

相关:下面是BUILD-MAX-HEAP\u BUILD-MAX-HEAP(A)A.heapsize=A.length for I=A.length/2 down to 1 MAX-HEAPIFY(A,I)的伪代码在上面,我们确实考虑了堆的深度来计算复杂性,即O(n)。为什么我们不在HEAPSORT中做呢?@lalatnayak,因为我们作弊了,并且已经知道我们在HEAPSORT中做的不比O(n log n)更好(提示:我们需要一个下限)。正因为如此,我们并没有试图改善我们的上限。谢谢,我怀疑我是否能在没有暗示的情况下找到它:)漂亮!只有一个输入错误,我想应该是log(n/e)
log n! ≈ n * (log n/e) = n * (log n - 1)  = n log n - n