2016-10-04 1 views
2

다음은힙 정렬 복잡성

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의 복잡성을 갖는 이유입니다. MAX-HEAPIFY 각각에 대해 n 회 반복이 있다는 것을 이해합니다. 하지만 MAX-HEAPIFY 콜은 각 반복에서 크기가 줄어드는 힙을 얻습니다. 어떻게 각 반복은 O (lgn)의 복잡성을 가질 수 있습니까? 그것은 단단히 묶여 있습니까? 내가 어디에서 같은 수학적 증거를 볼 수 있습니까?

+0

관련 항목 : http://stackoverflow.com/questions/39691923/build-max-heap-running-time-for-array-sorted-in-decreasing-order –

답변

2

그래서

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

, 스털링 근사에 의해, 이제

log 1 + log 2 + log 3 + ... + log n 
= log (1 * 2 * 3 * ... * n) 
= log n! 

을 준수하십시오

log n! ≈ n * (log n/e) = n * (log n - 1) = n log n - n

which is O(n log n) because the n log n 용어가 n 용어를 지배 (그리고 O는 (n)이 용어 I 로그 MathJax와 함께 입력하기가 너무 어렵 기 때문에 제외되었습니다).

+0

Beautiful! 그냥 한 오타, 나는 그것이 로그 (n/e)라고 생각한다 – Nicholas

+0

@nicholas : 꽤 맞다, 고마워. 결정된. – rici

+0

당신이 틀립니다. – lalatnayak

3

큰 O 표기법은 어퍼 바운드입니다. 당신이 말한대로 :

MAX-HEAPIFY는 로그 n의 최대 값을 갖는 힙의 높이 인 h (h)의 복잡성을가집니다.

힙이 작아도 상관하지 않습니다. 은 최악의 경우이고, 힙의 높이는 로그 n입니다. 우리는 이것을 n 번하므로, nlog n입니다.

+0

다음은 BUILD-MAX-HEAP의 의사 코드입니다. _BUILD-MAX-HEAP (A) = A.heapsize A.length 위한 I = A.length/2 MAX-1 HEAPIFY (I A) 위에서는 고려해야 할 downto 복잡성을 계산하는 힙의 깊이는 O (n)입니다. 왜 우리는 HEAPSORT에서하지 않았을까요? – lalatnayak

+0

@lalatnayak 우리는 속임수를 쓰고 이미 heapsort에 대해 O (n log n)보다 좋을 수 없다는 것을 이미 알고 있기 때문에 (힌트 : 하한이 필요합니다). 그렇기 때문에 우리는 상한을 개선하려고 시도하지 않습니다. – orlp

+0

감사합니다. 힌트없이 알아낼 수 있다면 의심 스럽습니다. – lalatnayak