Recent Posts
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Today
Total
관리 메뉴

Try

[알고리즘/자료구조] 힙 (Heap) 본문

Algorithm/Algorithm 기초

[알고리즘/자료구조] 힙 (Heap)

HAS3ONG 2018. 11. 29. 01:50


힙(heap)은 최댓값 및 최솟값을 찾아내는 연산을 빠르게 하기 위해 고안된 완전이진트리(Complete binary tree)를 기본으로 한 자료구조(tree-based structure)로서 다음과 같은 힙 속성(property)을 만족한다.


A가 B의 부모노드(parent node) 이면, A의 키(key)값과 B의 키값 사이에는 대소관계가 성립한다.

힙에는 두가지 종류가 있으며, 부모노드의 키값이 자식노드의 키값보다 항상 큰 힙을 '최대 힙', 부모노드의 키값이 자식노드의 키값보다 항상 작은 힙을 '최소 힙'이라고 부른다.



소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include<stdio.h>
#include<iostream>
 
using namespace std;
 
#define MAX_ELEMENT 100
 
class MaxPriorityQueue
{
public:
        int elem[MAX_ELEMENT]; //요소의 배열
        int size//현재 요소의 개수
public:
        void init()
        {
               size = 0;
        }
 
        int getParent(int i)
        {
               return i / 2;
        }
 
        int getLeft(int i)
        {
               return i * 2;
        }
 
        int getRight(int i)
        {
               return i * 2 + 1;
        }
 
        void insert(int data) //삽입 함수
        {
               if (size == MAX_ELEMENT)
                       return;
               int i = ++size;
               while (i != 1 && data > elem[getParent(i)]) //루트가 아니고 부모노드보다 값이 크면
               {
                       elem[i] = elem[getParent(i)]; //부모를 자식노드로 끌어내리고
                       i /= 2//한 레벨 상승
               }
               elem[i] = data;
        }
        int remove() //최대 항목 삭제 및 반환 함수
        {
               if (!size)
                       return NULL;
               int root = elem[1];
               int last = elem[size--];
               int parent = 1;
               int child = 2;
               while (child <= size)
 
               {
                       if (child < size && elem[getParent(parent)] < elem[getParent(parent)])
                              child++;
                       if (elem[last] >= elem[child])
                              break;
                       elem[parent] = elem[child];
                       parent = child;
                       child *= 2;
               }
               elem[parent] = last;
               child *= 2;
        }
 
        int find() //최대 항목 반환 함수
        {
               return elem[1];
        }
 
        void display() //우선순위 큐의 모든 항목 출력
        {
               int res = 1;
               int square = 2;
               int height = 1;
               int start = 0;
               while (res <= size)
               {
                       res *= 2;
                       height++;
               }
 
               for (int i = 1; i <= size; i++)
               {
                       if (i==1 || i == square)
                       {
                              cout << endl;
                              for (int j = start; j < height; j++)
                                      cout << "\t";
                              if(i!=1)
                                      square *= 2;
                              start++;
                       }
                       cout << elem[i];
                       for (int j = 0; j < height - start; j++)
                       {
                              if (i % 2)
                                      cout << "\t";
                              else
                                      cout << "\t";
                       }
               }
               cout << endl;
        }
};
 
void main(void)
{
        MaxPriorityQueue q;
        q.init();
        int arr[15];
        for (int i = 0; i < 15; i++)
        {
               arr[i] = rand() % 100 + 1;
               cout << arr[i] << " ";
        }
 
        cout << endl;
        cout << "우선순위 큐" << endl;
        for (int i = 0; i < 15; i++)
               q.insert(arr[i]);
 
        q.display();
}
cs


결과화면




출처

위키피디아

https://en.wikipedia.org/wiki/Heap_(data_structure)

Comments