누룽지맛치킨
어미새의 개발일지
누룽지맛치킨
전체 방문자
오늘
어제
  • 분류 전체보기 (86)
    • 코틀린 (8)
    • 안드로이드 (5)
      • 디자인 (2)
      • 개발 (2)
      • 도구 (1)
    • 피그마 (1)
    • 대외활동 (0)
    • 프로젝트 (0)
    • 백준 (55)
      • JAVA (55)
    • 알고리즘 (3)
    • 클라우드 (5)
    • 스터디 (2)
      • 코테 (2)
    • 자료구조 (5)
    • 컴퓨터 기술 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준 자바 수열
  • 코틀린 runBlocking
  • 백준 자바 정렬
  • 안드로이드 디자인
  • 백준 자바 2292번
  • Room version 올리기
  • 안드로이드
  • 백준 자바 벌집
  • 백준 자바 다이나믹 프로그래밍
  • 자료구조
  • 클라우드
  • Room Migration
  • 클라우드 컴퓨팅
  • 알고리즘 조합
  • 백준 자바 2559번
  • 코틀린
  • 자바 Priority Queue
  • 백준 자바
  • 코틀린 인 액션
  • 백준 자바 누적합

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
누룽지맛치킨

어미새의 개발일지

힙(heap)
자료구조

힙(heap)

2023. 2. 10. 14:51
  • 완전 이진 트리의 일종
  • 우선순위 큐를 위해 만들어진 자료구조
  • 느슨한 정렬 상태 유지
    • 큰 값이 상위 레벨에 있는 동시에 하위 레벨에도 존재 가능
    • 부모 노드의 키 값이 자식 노드의 키 값보다 항상 작거나 큰 이진 트리
  • 힙 트리에서는 중복된 값 허용

힙의 종류

  • 최대 힙
    • 부모 노드의 키 값이 자식 노드의 키 값보다 크거나 같은 완전 이진 트리
  • 최소 힙
    • 부모 노드의 키 값이 자식 노드의 키 값보다 작거나 같은 완전 이진 트리

힙 구현

  • 자료구조 배열 사용(표준)
  • 0번 인덱스 사용 x
  • 부모 노드 자식 노드 관계
    • 왼쪽 자식 노드 = (부모 인덱스) *2
    • 오른쪽 자식 노드 = (부모 인덱스) *2 +1
    • 부모 노드 = (자식 인덱스)/2

활용

  • 시뮬레이션 시스템
  • 네트워크 트래픽 제어
  • 운영 체제에서의 작업 스케쥴링
  • 수치 해석적인 계산

힙 연산자

  • 삽입

 

// 최대 힙 삽입
void insert_heap(int input) {

    Heap[++heapSize] = input; // 힙 크기를 하나 증가하고, 마지막 노드에 값 삽입

    for( int i = heapSize; i > 1; i /= 2) {

        // 마지막 노드가 자신의 부모 노드보다 크면 swap
        if(Heap[i/2] < Heap[i]) {
            swap(i/2, i);
        } else {
            break;
        }

    }
}
  • 삭제

 

// 최대 힙 삭제
int delete_heap() {

    if(heapSize == 0) // 배열이 비어있으면 리턴
        return 0;

    int result = Heap[1];         // 루트 노드의 값을 저장
    Heap[1] = Heap[heapSize];     // 마지막 노드 값을 루트로 이동
    Heap[heapSize--] = 0;         // 마지막 노드 값을 초기화 후 사이즈 1 감소

    for(int i = 1; i*2 <= heapSize;) {

        // 마지막 노드 자식 노드들 보다 큰 경우
        if(Heap[i] > Heap[i*2] && Heap[i] > Heap[i*2+1]) {
            break;
        }
        // 왼쪽 자식 노드가 더 큰 경우
        else if (Heap[i*2] > Heap[i*2+1]) {
            swap(i, i*2);
            i = i*2;
        }
        // 오른쪽 자식 노드가 더 큰 경우
        else {
            swap(i, i*2+1);
            i = i*2+1;
        }
    }

    return result;

}

 

이미지 출처 : https://velog.io/@emplam27/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-%ED%9E%99Heap
)

(이미지 출처 : https://velog.io/@emplam27/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-%ED%9E%99Heap
)

 

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

[JAVA] Priority Queue  (0) 2023.07.06
덱(deque)  (0) 2023.02.02
큐  (0) 2023.02.02
스택  (0) 2023.02.02
    '자료구조' 카테고리의 다른 글
    • [JAVA] Priority Queue
    • 덱(deque)
    • 큐
    • 스택
    누룽지맛치킨
    누룽지맛치킨

    티스토리툴바