Grace
grace's dev_note
Grace
전체 방문자
오늘
어제
  • 분류 전체보기
    • FrontEnd
      • Next.js
      • React
      • ReactNativ..
      • Vue
    • Javascript
      • 러닝 자바스크립트
      • 모던 자바스크립트
    • CS
    • DataScienc..
      • Data Struc..
      • LeetCode
    • BackEnd
      • Express
      • Node.js
      • Nest.js
    • DevOps
      • Docker
    • 매일메일
    • 회고
    • 코드캠프

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Express
  • tanstack
  • Vue3
  • 자바스크립트
  • javascript
  • 알고리즘
  • pinia
  • 함수
  • nest.js
  • postgres
  • vitejs
  • vue-query
  • node.js
  • Vite
  • Vue
  • React Native
  • backend
  • PostgreSQL
  • 번들러
  • Vue.js

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Grace

grace's dev_note

DataScience/Data Structure

[자료구조] 힙

2023. 12. 4. 11:48

우선순위 큐

  • 큐: 먼저 들어간 데이터가 먼저 삭제되는 자료구조
  • 우선순위 큐: 대기 리스트에서 우선순위 높은 사람이 먼저 서비스를 받는 구조
  • 데이터 삭제(Delete_q())와 삽입(Add_q(3)): Delete_q()에 의해 큐의 front에 있던 ‘1’이 삭제되면서, 나머지 데이터 중에서 가장 작은 값인 ‘2’가 다음 삭제 위치 즉, front가 가리키는 위치로 이동됨
  • 우선순위 큐의 작동 방식
    • 삭제 명령이 실행되면 저장된 데이터 중에서 가장 작은 값(가장 큰 값)이 삭제된다.
    • 나머지 데이터들은 어떤 순서로 저장되든 문제가 되지 않는다.

힙 추상 자료형

  • 힙
    • 피라미드 모양으로 쌓아 올린 더미
    • 무엇인가를 쌓아놓은 더미이고 항상 가장 위에 있는 것을 우선 꺼내는 구조
    • 부모-자식 노드 사이에서(부분적으로) 정렬된 완전 이진 트리로 부모노드는 자식노드보다 우선순위가 높음
  • 연산
    • insert(element) ::= 힙에 데이터 삽입
    • delete() ::= 힙(루트)에서 데이터 삭제
    • peek() ::= 힙(루트)에서 데이터 읽어오기
    • isEmpty() ::= 힙이 비었는지 확인
    • size() ::= 힙에 저장한 데이터 개수 확인

힙의 종류

  • 최소 힙: 루트가 전체 노드 중에서 최소값인 힙
    • 트리의 모든 노드가 자식 노드보다 작은 값을 가짐
    • 트리의 레벨에 따라 데이터가 순서를 갖지는 않음
    • 탐색 트리처럼 왼쪽 노드와 오른쪽 노드 사이에 크기 제한도 없음
    • 루트가 가장 작은 값을 갖고 부모는 자식보다 작은 값을 가짐
  • 최대 힙: 루트가 전체 노드 중에서 최대값인 힙
    • 트리의 모든 노드가 자식 노드보다 큰 값을 가짐
    • 트리의 레벨에 따라 데이터가 순서를 갖지는 않음
    • 탐색 트리처럼 왼쪽 노드와 오른쪽 노드 사이에 크기 제한도 없음
    • 루트가 가장 큰 값을 갖고 부모는 자식보다 큰 값을 가짐

힙에서 삭제 및 삽입 연산

배열을 이용한 힙의 구현

  • 배열을 이용한 힙의 구현: 완전 이진트리이기 때문에 배열로 구현해도 기억장소 낭비가 없음
    • 연결 리스트보다 실행 속도 면에서 효율적임
    • 기억장소 측면에서도 장점을 가짐
  • 힙의 노드 삭제
typedef struct heap {
	int heap[MAX_SIZE];
	int size;
} heap;

int min_heapDelete(heap *h) {
	int parent, child;
	int data, temp;

	data = h -> heap[1];
	temp = h -> heap[(h->size)--];
	parent = 1;
	child = 2;

	while(child <= h -> size) {
		if((child < h -> size) && (h -> heap[child] > h -> heap[child+1])) child++;
		if(temp <= h -> heap[child]) break;
		h -> heap[parent] = h -> heap[child];
		parent = child;
		child *= 2;
	}
	h -> heap[parent] = temp;
	return data;
}
  • 힙의 노드 삽입
void min_heapInsert(heap *h, int data) {
	int i;
	i = ++(h -> size);
	
	while((i != 1) && (data < h -> heap[i/2])) {
		h -> heap[i] = h -> heap[i/2];
		i /= 2;
	}
	h -> heap[i] = data;
}
저작자표시 비영리 변경금지 (새창열림)

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

[자료구조] BS, Splay, AVL, BB  (1) 2023.12.05
[자료구조] 선택 트리, 숲, 이진 트리 개수  (0) 2023.12.04
[자료구조] 트리  (0) 2023.11.30
[자료구조] 연결 리스트  (0) 2023.11.20
[자료구조] 큐  (1) 2023.11.19
    'DataScience/Data Structure' 카테고리의 다른 글
    • [자료구조] BS, Splay, AVL, BB
    • [자료구조] 선택 트리, 숲, 이진 트리 개수
    • [자료구조] 트리
    • [자료구조] 연결 리스트
    Grace
    Grace
    기술 및 회고 블로그

    티스토리툴바