[πŸ“—cμ–Έμ–΄ μ‰½κ²Œ ν’€μ–΄μ“΄ 자료ꡬ쑰9] μš°μ„ μˆœμœ„ 큐

μ•ˆμ§€μˆ˜Β·2023λ…„ 2μ›” 12일
0

πŸ‘‘ μš°μ„ μˆœμœ„ 큐 μ†Œκ°œμ™€ κ΅¬ν˜„

: μš°μ„ μˆœμœ„κ°€ 높은 데이터가 λ¨Όμ € λ‚˜κ°

& κ΅¬ν˜„λ°©λ²•
1. λ°°μ—΄

  • μ •λ ¬ λ˜μ–΄μžˆλŠ” 경우: μ‚½μž… (O(n)), μ‚­μ œ(O(1))
  • μ •λ ¬ λ˜μ–΄μžˆμ§€ μ•Šμ€ 경우: μ‚½μž… (O(1)), μ‚­μ œ(O(n))
  1. μ—°κ²°λ¦¬μŠ€νŠΈ
  • μ •λ ¬ λ˜μ–΄μžˆλŠ” 경우: μ‚½μž… (O(n)), μ‚­μ œ(O(1))
  • μ •λ ¬ λ˜μ–΄μžˆμ§€ μ•Šμ€ 경우: μ‚½μž… (O(1)), μ‚­μ œ(O(n))
  1. νžˆν”„

πŸ‘‘ νžˆν”„μ˜ κ°œλ…

: μ™„μ „μ΄μ§„νŠΈλ¦¬λ‘œ, μš°μ„ μˆœμœ„ 큐λ₯Ό μœ„ν•΄ λ§Œλ“€μ–΄μ§„ μžλ£Œκ΅¬μ‘°μž„

  • λŠμŠ¨ν•œ μ •λ ¬ μƒνƒœ, 쀑볡값 ν—ˆμš©
  • λ°°μ—΄λ‘œ μ €μž₯ (인덱슀 0은 μ‚¬μš©λ˜μ§€ μ•ŠμŒ)
  • μ™Όμͺ½ μžμ‹μ˜ 인덱슀: λΆ€λͺ¨μ˜ 인덱슀*2
  • 였λ₯Έμͺ½ μžμ‹μ˜ 인덱슀: λΆ€λͺ¨*2+1
  • λΆ€λͺ¨μ˜ 인덱슀: μžμ‹μ˜ 인덱슀/2

& νžˆν”„μ˜ 쑰건
1. μ™„μ „μ΄μ§„νŠΈλ¦¬
2. λΆ€λͺ¨λ…Έλ“œ >= μžμ‹λ…Έλ“œ

& νžˆν”„μ˜ μ’…λ₯˜
1. μ΅œλŒ€ νžˆν”„
2. μ΅œμ†Œ νžˆν”„: μž‘μ„μˆ˜λ‘ 루트둜

πŸ‘‘ νžˆν”„μ˜ κ΅¬ν˜„ (μ‚½μž…, μ‚­μ œ)

  • μ‚½μž…: λ§ˆμ§€λ§‰ λ…Έλ“œμ— μ‚½μž… ν›„, μž¬κ΅¬μ„± (νžˆν”„μ˜ 쑰건 λ§Œμ‘±ν•˜λ„λ‘) / O(logn)- μž¬κ΅¬μ„±ν•΄μ„œ λ†’μ΄λ§ŒνΌ 올라감
  • μ‚­μ œ: 루트 λ…Έλ“œ λ°˜ν™˜ ν›„, λ§ˆμ§€λ§‰ λ…Έλ“œ 루트둜 κ°€μ Έμ™€μ„œ κ°•λ“±μ‹œν‚΄ / O(logn)- λ§ˆμ§€λ§‰ κΊΌ κ°€μ Έμ™€μ„œ λ†’μ΄λ§ŒνΌ κ°•λ“±μ‹œν‚΄
#include <stdio.h>
#include <stdlib.h>
#define MAX_ELEMENT 200
typedef struct {
	int key;
}element;
typedef struct {
	element heap[MAX_ELEMENT];
	int heap_size;
}HeapType;

//μƒμ„±ν•¨μˆ˜
HeapType* create() {
	return (HeapType*)malloc(sizeof(HeapType));
}

//μ΄ˆκΈ°ν™” ν•¨μˆ˜
void init(HeapType* h) {
	h->heap_size = 0;
}

//μ‚½μž… ν•¨μˆ˜(μ΅œλŒ€ νžˆν”„)
void insert_max_heap(HeapType* h, element item) {
	int i;
	i = (++h->heap_size);

	while (i != 1 && item.key > h->heap[i / 2].key) { //λΆ€λͺ¨λ³΄λ‹€ 크면 λ°”κΏˆ
		h->heap[i] = h->heap[i / 2];
		i /= 2;
	}
	h->heap[i] = item;
}

//μ‚­μ œ ν•¨μˆ˜(μ΅œλŒ€ νžˆν”„)- λΆ€λͺ¨λ₯Ό λŒμ–΄λ‚΄λ¦° ν›„ λ§ˆμ§€λ§‰μ— λŒ€μž… 그리고 λ°˜ν™˜
element delete_max_heap(HeapType* h) {
	int parent, child;
	element item, temp;

	item = h->heap[1];  //λ°˜ν™˜ν•  κ°’ μ €μž₯(λ§ˆμ§€λ§‰μ— λ°˜ν™˜)
	temp = h->heap[(h->heap_size)--];   //λ§ˆμ§€λ§‰ λ…Έλ“œ(μœ„λ‘œ λŒμ–΄μ˜¬λ¦΄ κ²ƒμž„)
	parent = 1;  //λ§ˆμ§€λ§‰ 값을 집어넣을 인덱슀
	child = 2;
	while (child <= h->heap_size) {  //heap μ‚¬μ΄μ¦ˆ 이내일 λ•Œ 반볡
		if ((child < h->heap_size) && (h->heap[child].key) < h->heap[child + 1].key) //큰 μžμ‹ 선택(였λ₯Έμͺ½μ΄ 더 크면 +1)
			child++;
		if (temp.key >= h->heap[child].key) break;  //제 μœ„μΉ˜λ₯Ό 찾은 경우(끝)
		h->heap[parent] = h->heap[child];  //λΆ€λͺ¨ λŒμ–΄λ‚΄λ €(아직 제 μœ„μΉ˜ λͺ»μ°Ύμ€ 경우)
		parent = child;
		child *= 2;
	}
	h->heap[parent] = temp;
	return item;
}

πŸ‘‘ νžˆν”„ μ •λ ¬κ³Ό μ‹œκ°„ λ³΅μž‘λ„

: μ΅œλŒ€ νžˆν”„ 정렬을 톡해 O(nlogn) μ‹œκ°„ μ•ˆμ— μ •λ ¬
-> μ΅œλŒ€ νžˆν”„λ₯Ό 톡해 μ‚½μž… ν›„, ν•˜λ‚˜ μ”© μ‚­μ œν•˜λ©΄μ„œ λ°°μ—΄μ˜ 맨 끝 값에 λ„£μ–΄μ£Όκ³ , ν•˜λ‚˜ μ”© 좜λ ₯해주면됨.

  • κ°€μž₯ 큰 값을 λͺ‡ 개만 ν•„μš”λ‘œν•  λ•Œ 유용

πŸ‘‘ ν—ˆν”„λ§Œ μ½”λ“œ

: λΉˆλ„μˆ˜ 높은 κΈ€μžμ— μž‘μ€ 크기의 μ½”λ“œ ν• λ‹Ή (μž‘μ€κ²ƒλΌλ¦¬ ν•©μΉ˜κΈ°)

β­• TIL (Today I learned)

& 배운 λ‚΄μš© λ‚΄ μ–Έμ–΄λ‘œ μ •λ¦¬ν•˜κΈ°
μš°μ„ μˆœμœ„ νλŠ” μš°μ„ μˆœμœ„κ°€ 높은 것을 λ¨Όμ € λΉΌλ‚΄λŠ” 큐이닀. μš°μ„ μˆœμœ„νλŠ” λ°°μ—΄, μ—°κ²°λ¦¬μŠ€νŠΈ νžˆν”„λ₯Ό 톡해 κ΅¬ν˜„ν•  수 있고, λ°°μ—΄μ΄λ‚˜ μ—°κ²°λ¦¬μŠ€νŠΈκ°€ μ •λ ¬λ˜μ–΄ μžˆλŠλƒ μ•„λ‹ˆλƒμ— 따라 μ‹œκ°„λ³΅μž‘λ„κ°€ 달라진닀. νžˆν”„λŠ” μš°μ„ μˆœμœ„ 큐λ₯Ό μœ„ν•΄μ„œ λ§Œλ“€μ–΄μ§„ 자료ꡬ쑰둜, μ™„μ „ μ΄μ§„νŠΈλ¦¬μ΄λ©° μ΅œλŒ€ νžˆν”„μ˜ κ²½μš°μ—λŠ” λΆ€λͺ¨λ…Έλ“œκ°€ 항상 μžμ‹λ…Έλ“œλ³΄λ‹€ ν¬κ±°λ‚˜ κ°™μ•„μ•Όν•œλ‹€. (쀑볡값 ν—ˆμš©) μ΅œμ†Œ νžˆν”„μ˜ κ²½μš°μ—λŠ” λΆ€λͺ¨λ…Έλ“œκ°€ 항상 μžμ‹λ…Έλ“œλ³΄λ‹€ μž‘κ±°λ‚˜ κ°™μ•„μ•Όν•˜λŠ” 것이닀. νžˆν”„μ˜ μ‚½μž… 연산은 맨 λ§ˆμ§€λ§‰ λ…Έλ“œμ— μ‚½μž… ν›„ μž¬κ΅¬μ„±μ„ ν•΄μ£ΌλŠ” 것이고, μ‚­μ œ 연산은 맨 루트λ₯Ό λ°˜ν™˜ ν›„, λ§ˆμ§€λ§‰ κΊΌλ₯Ό 루트둜 λŒμ–΄μ™€μ„œ κ°•λ“±μ‹œν‚€λŠ” 것이닀. 이 νžˆν”„λ₯Ό μ΄μš©ν•΄μ„œ 정렬을 ν•  수 μžˆλ‹€.(νžˆν”„ μ •λ ¬) μ‚½μž…μ—°μ‚°μ„ 톡해 μ‚½μž… ν›„, μ΅œλŒ€ νžˆν”„λ₯Ό 톡해 μ‚­μ œλ₯Ό ν•˜λ©°, λ°°μ—΄μ˜ λ§ˆμ§€λ§‰ μΈλ±μŠ€μ— λ„£λŠ” 것이닀. 또 μ΄λŸ¬ν•œ νžˆν”„λ₯Ό μ΄μš©ν•œ 것이 ν—ˆν”„λ§Œ μ½”λ“œμΈλ°, μ΄λŠ” κ°€μž₯ λΉˆλ„μˆ˜κ°€ 높은 κΈ€μžμ— μž‘μ€ μ½”λ“œλ₯Ό λΆ€μ—¬ν•˜λŠ” 것이닀.

profile
μ§€μˆ˜μ˜ μ·¨μ€€, 개발일기

0개의 λŒ“κΈ€