CS/자료구조

자료구조 - Heap

빈둥벤둥 2021. 2. 18. 22:00

Heap


Heap

  • 완전 이진 트리이며 최대, 최소값만을 필요로 할 때 적합한 자료구조이다.

  • 시간복잡도- 요소의 개수가 n개일때 삽입, 삭제시 트리의 높이 만큼 소요된다.

    1. insert: O(nlogn)

    2. delete: O(nlogn)

 

구현 with JAVA

  • 최대힙
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
public class maxHeap{
    private int[] heap;
    private int idx;
    private int size;
 
    //생성자
    public maxHeap(int size) {
        this.idx = 0;
        this.size = size;
        maxHeap = new int[size];
    }
 
    public boolean isEmpty() {
        return idx == 0
    }
 
    public boolean isFull()    {
        return idx == size;
    }
 
    //힙에 데이터 insert. 우선 맨 마지막 위치에 data를 삽입한 후 부모 노드와 값을 비교하면 자리를 찾는다
    public void insert(int data) {
        if(isFull()) return;
        else {        
            maxHeap[++idx] = data;
            int index = idx;
            while(index > 1 && (maxHeap[index] > maxHeap[index / 2]) { //부모 노드의 값이 더 작은 경우 부모와 자리를 바꾼다.
                int temp = maxHeap[index];
                maxHeap[index] = maxHeap[index / 2];
                maxHeap[index / 2= temp;
                index = index / 2;
            }
        }
    }
 
    //힙의 데이터 delete. 루트의 데이터를 삭제한 후 반환하고, 루트에는 맨 마지막 위치의 데이터를 넣어준다.
    public int delete() {     
        if(isEmpty()) return;
        else {
            int root = maxHeap[1];
            maxHeap[1= maxHeap[idx];
            maxHeap[idx--= 0;
            maxHeapify(); //다시 재정렬한다.
            return root;
        }
    }
 
//최대힙 정렬
    public void maxHeapify() {
        int index = 1;
        int temp;    
 
        while(index * 2 <= idx) {
            if(maxHeap[index * 2> maxHeap[index * 2 + 1]) { //왼쪽 자식의 값이 더 큰경우
                temp = maxHeap[index];
                maxHeap[index] = maxHeap[index * 2];
                maxHeap[index + 2= temp;
                index = index * 2;    
            } else { //오른쪽 자식의 값이 더 큰경우
                temp = maxHeap[index];
                maxHeap[index] = maxHeap[index * 2 + 1];
                maxHeap[index + 2 + 1= temp;
                index = index * 2 + 1;    
            }
        }
    }
}
 
cs

 

  • 최소힙
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
public class minHeap{
    private int[] heap;
    private int idx;
    private int size;
 
    //생성자
    public minHeap(int size) {
        this.idx = 0;
        this.size = size;
        minHeap= new int[size];
    }
 
    public boolean isEmpty() {
        return idx == 0
    }
 
    public boolean isFull()    {
        return idx == size;
    }
 
    //힙에 데이터 insert. 우선 맨 마지막 위치에 data를 삽입한 후 부모 노드와 값을 비교하면 자리를 찾는다
    public void insert(int data) {
        if(isFull()) return;
        else {        
            minHeap[++idx] = data;
            int index = idx;
            while(index > 1 && (minHeap[index] < minHeap[index / 2]) { //부모 노드의 값이 더 큰 경우 부모와 자리를 바꾼다.
                int temp = minHeap[index];
                minHeap[index] = minHeap[index / 2];
                minHeap[index / 2= temp;
                index = index / 2;
            }
        }
    }
 
    //힙의 데이터 delete. 루트의 데이터를 삭제한 후 반환하고, 루트에는 맨 마지막 위치의 데이터를 넣어준다.
    public int delete() {     
        if(isEmpty()) return;
        else {
            int root = minHeap[1];
            minHeap[1= minHeap[idx];
            minHeap[idx--= 0;
            minHeapify(); //다시 재정렬한다.
            return root;
        }
    }
 
//최소힙 정렬
    public void minHeapify() {
        int index = 1;
        int temp;    
 
        while(index * 2 <= idx) {
            if(minHeap[index * 2< minHeap[index * 2 + 1|| minHeap[index * 2 + 1== 0) { //왼쪽 자식의 값이 더 작은경우
                temp = minHeap[index];
                minHeap[index] = minHeap[index * 2];
                minHeap[index + 2= temp;
                index = index * 2;    
            } else { //오른쪽 자식의 값이 더 작은경우
                temp = minHeap[index];
                minHeap[index] = minHeap[index * 2 + 1];
                minHeap[index + 2 + 1= temp;
                index = index * 2 + 1;    
            }
        }
    }
}
 
cs

reference