8-4. [C/C++] 힙에서의 삽입 연산

2023. 7. 30. 14:34·Computer Science/Data Structure

아래 글 내용에서 이어지는 내용이므로 아래 글을 보고 오는 것을 추천한다.

https://seongmoahn.tistory.com/107

 

8-3. [C/C++] 힙(Heap) 구현

힙이란? 힙은 여러 개의 값들 중에서 가장 큰 값이나 가장 작은 값을 빠르게 찾아내도록 만들어진 자료구조이다. 힙을 간단히 말하면 부모 노드의 키 값이 자식 노드의 키 값보다 큰/작은 완전

seongmoahn.tistory.com

힙에서의 삽입 연산

힙에 새로운 요소가 들어오면, 일단 완전 이진트리의 조건을 만족하는 마지막 위치에 삽입한다.

그러면 대부분의 경우 힙 트리의 조건을 만족하지 않을 것이다.

그래서 삽입 후에 부모 노드와 비교하며 조건의 맞는 자리를 찾는다.


삽입 연산의 구현

삽입 연산의 알고리즘을 알아보자.

insert(key) // 최대 힙에서의 삽입 알고리즘

heapSize <- heapSize + 1;
i <- heapSize;
node[i] <- key;
while i != 1 and node[i] > node[PARENT(i)] do
	node[i] <-> node[PARENT(i)];
    i <- PARENT(i);

위 알고리즘에서는 <-> 기호가 노드를 교환하는 것을 나타낸다.

하지만 실제 구현에서는 매번 노드를 교환하는 것이 아닌, 이동 횟수를 줄이기 위해 부모 노드만을 끌어내린 다음에 삽입될 위치가 정해지면 그 위치에 새로운 노드를 이동시키는 방식으로 구현한다.

 

앞서 만들어놨던 기본 틀에 insert() 연산을 추가하자.

// MaxHeap.h
#include "HeapNode.h"
#define MAX_ELEMENT 200
...
class MaxHeap {
    HeapNode node[MAX_ELEMENT];
    int size;

public:
...
	void insert(int key) {
        if (isFull()) errorPrint("Heap Overflow");

        int i = ++size;
        while (i != 1 && key > getParent(i).getKey()) {
            node[i] = getParent(i);
            i /= 2;
        }
        node[i].setKey(key);
    }
...
};

위 코드는 아래 이미지를 클릭해 깃허브에서도 확인할 수 있다.

깃허브 이미지 링크

저작자표시 (새창열림)

'Computer Science > Data Structure' 카테고리의 다른 글

8-6. [C/C++] 힙의 응용 : 힙 정렬  (0) 2023.07.30
8-5. [C/C++] 힙에서의 삭제 연산  (0) 2023.07.30
8-3. [C/C++] 힙(Heap) 구현  (0) 2023.07.30
8-2. 우선순위 큐의 구현 방법  (0) 2023.07.30
8-1. 우선순위 큐란?  (0) 2023.07.30
'Computer Science/Data Structure' 카테고리의 다른 글
  • 8-6. [C/C++] 힙의 응용 : 힙 정렬
  • 8-5. [C/C++] 힙에서의 삭제 연산
  • 8-3. [C/C++] 힙(Heap) 구현
  • 8-2. 우선순위 큐의 구현 방법
Study with Me!
Study with Me!
Study with Me!
  • Study with Me!
    Seongmo
    Study with Me!
  • 전체
    오늘
    어제
    • Computer (136)
      • Computer Science (61)
        • Data Structure (51)
        • Algorithm (6)
        • 선형대수 with C++ (4)
      • Arm Architecture (1)
        • Register (0)
        • Assembly Instruction (1)
      • Linux (32)
        • Linux Kernel (4)
        • 라이브러리 함수 구현하기 (0)
        • 쉘, 쉘 명령어 구현하기 (15)
        • Ubuntu (13)
      • Cloud Infrastructure (8)
        • Kubernetes (7)
        • OpenStack Magnum (1)
      • AWS (3)
      • Baekjoon (18)
      • Tools (6)
        • Git & Github (5)
        • Vim (1)
      • 개발 환경 (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    STL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Study with Me!
8-4. [C/C++] 힙에서의 삽입 연산
상단으로

티스토리툴바