2011-03-08 7 views
7

나는 힙을 포함하는 숙제를하고 있는데, 어떻게 구성되어 있는지 이해하고 있습니다. 힙이 힙 특성을 만족하는 각 노드에 있어야 힙 데이터 구조의 용도는 무엇입니까?

최대 힙 특성임을 각 노드 나 다른 그 루트 힙 [지배 (I)]> = 힙 [I]

각 노드에서 높은 노드는 높은 숫자를 가지며 낮은 노드는 낮은 숫자를 갖습니다. 나는 이것을 이해한다. 그러나 목록에서 가장 높은 n 개의 숫자를 얻는 것 이외에 힙을 사용하는 것을 볼 수는 없습니다. 특정 값을 검색하여 노드를 반환하거나 n 개의 가장 낮은 숫자 (최대 힙)를 검색하는 쉬운 방법은 없습니다. 이진 검색 트리에서는 두 가지 방법 모두 비교적 쉽습니다.

왜 간단한 이진 검색 트리를 사용하지 않습니까? 아니면 더 나은, 균형 이진 검색 트리?

편집 : 숙제 문제에 대한 답변을 찾는 것이 아닙니다. 실제 숙제 문제는 insert() 및 extractMax() 함수에 대한 병렬 -p 힙에 의사 코드를 작성하는 것이 었습니다. 그리고 나는 이미 그들에게 대답했다. 그들은 단지 내가 힙을 정말로 이해하지 못한다는 것을 깨닫게했다.

+0

가능한 중복 (HTTP : // 유래.com/questions/749199/when-would-i-want-to-use-a-heap) –

+0

@Jeremiah, 나는 그 대답을 찾았지만 그 중 하나를 놓쳤다. 그리고 옙, 나는 마치 멍청이처럼 보입니다. 내 질문을 닫아야합니까? –

+0

필요 없음. 그것은 우리에 의해 폐쇄 될 것입니다,하지만 dups는 일반적으로 좋은 일로 여겨집니다. 같은 질문을하는 방법은 여러 가지가 있기 때문입니다. –

답변

4

포인터 (힙은 일반적으로 배열 기반 데이터 구조를 사용하지 않음) 때문에 이진 트리보다 작업이 빠른 경향이 있습니다. 또한, 더 복잡한 힙 (binomial과 같은)을 효율적으로 병합 할 수 있습니다. 이는 이진 트리에 대해 수행하기 쉽지 않습니다. this SO question에 대한 정보도 있습니다.

11

힙 데이터 구조에는 많은 응용 프로그램이 있습니다.

  • 힙 정렬 (Heapsort) : 장소-에없이 차 최악의 시나리오 인 최적의 정렬 방법 중 하나입니다.
  • 선택 알고리즘 : 최소, 최대, 중간 또는 심지어 k 번째로 큰 요소를 찾는 것은 힙을 사용하여 선형 시간 (종종 일정 시간)으로 수행 할 수 있습니다. [4]
  • 그래프 알고리즘 : 내부 순회 데이터 구조로 힙을 사용하면 런타임이 다항식 순서에 따라 줄어 듭니다. 이러한 문제의 예는 Prim의 최소 스패닝 트리 알고리즘과 Dijkstra의 최단 경로 문제입니다.

전체 및 거의 전체 바이너리 힙은 어레이를 사용하여 매우 공간 효율적인 방식으로 표현 될 수 있습니다. 첫 번째 (또는 마지막) 요소는 루트를 포함합니다. 배열의 다음 두 요소는 자식을 포함합니다. 다음 4 개의 노드는 2 개의 자식 노드 등 네 개의 자식 노드를 포함합니다. 따라서 노드 n의 자식 노드는 1 기반 배열의 2n 및 2n + 1 위치에 있고 2n 노드 배열의 2n + 1 및 2n + 2에 있습니다. 제로로부터 시작되는 배열. 이렇게하면 간단한 인덱스 계산을 수행하여 트리를 위아래로 이동할 수 있습니다. 힙의 균형은 순서가 잘못된 요소를 교체하여 수행됩니다. 여분의 메모리 (예 : 노드의 경우)를 사용하지 않고 배열에서 힙을 만들 수 있기 때문에 힙을 사용하여 배열을 내부 정렬 할 수 있습니다.

일부 응용 프로그램에서 트리에 대한 힙의 장점 중 하나는 Tarjan 알고리즘을 사용하여 선형 시간으로 힙을 만들 수 있다는 것입니다.

참조 : [? 내가 힙을 사용하고 싶을 때]의 http://en.wikipedia.org/wiki/Heap_%28data_structure%29

관련 문제