ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자료구조 - Heap
    CS/자료구조 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

    'CS > 자료구조' 카테고리의 다른 글

    자료구조 - 이진검색트리(ALV, RED-BLACK)  (0) 2021.02.21
    자료구조 - 이진검색트리  (0) 2021.02.20
    자료구조 - 이진트리  (0) 2021.02.18
    자료구조 - Queue  (0) 2021.02.17
    자료구조 - Stack  (0) 2021.02.17

    댓글

Designed by Tistory.