๐ป
[์๋ฃ๊ตฌ์กฐ] ์ฐ์ ์์ ํ ๋ณธ๋ฌธ
์ฐ์ ์์ ํ๋ '์ฐ์ ์์'๋ฅผ ๊ฐ์ง ๋ฐ์ดํฐ๋ค์ ์ ์ฅํ๋ ํ๋ฅผ ์๋ฏธํ๋ค.
๋ฐ์ดํฐ๋ฅผ ๊บผ๋ผ ๋ ์ฐ์ ์์๊ฐ ๋์ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ๋์จ๋ค๋ ํน์ง์ด ์์ด์ ๋ง์ด ํ์ฉ๋๊ณ ์๋ค.
์ฐ์ ์์ ํ๋ ์ด์์ฒด์ ์ ์์ ์ค์ผ์ค๋ง, ์ ๋ ฌ, ๋คํธ์ํฌ ๊ด๋ฆฌ ๋ฑ์ ๋ค์ํ ๊ธฐ์ ์ ์ ์ฉ๋๊ณ ์๋ค.
์ฐ์ ์์ ํ์ ์๊ฐ๋ณต์ก๋๋ O(NlogN)์ด๋ค.
์ผ๋ฐ์ ์ธ ํํ์ ํ๋ ์ ํ์ ์ธ ํํ๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ์ฐ์ ์์ ํ๋ ํธ๋ฆฌ(Tree) ๊ตฌ์กฐ๋ก ๋ณด๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ค. (์์ ์ด์งํธ๋ฆฌ์ ํก์ฌ)
์ผ๋ฐ์ ์ผ๋ก ์ฐ์ ์์ ํ๋ ์ต๋ ํ์ ์ด์ฉํด ๊ตฌํํ๋ค.
์ต๋ ํ(Max Heap)
๋ถ๋ชจ ๋ ธ๋๊ฐ ์์ ๋ ธ๋๋ณด๋ค ๊ฐ์ด ํฐ ์์ ์ด์ง ํธ๋ฆฌ๋ฅผ ์๋ฏธํ๋ค.
์ ์ฒด ํธ๋ฆฌ์์ ๋ฃจํธ ๋ ธ๋๊ฐ ๊ฐ์ฅ ํฐ ๊ฐ์ ๊ฐ์ง๋ค.
์ฐ์ ์์ ํ์ ์ฝ์
- ์์ ์ด์ง ํธ๋ฆฌ๋ฅผ ์ ์งํ๋ ํํ๋ก ์์ฐจ์ ์ผ๋ก ์ฝ์ ๋๋ค.
- ์ฝ์ ์ดํ์๋ ๋ฃจํธ ๋ ธ๋๊น์ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉด์ ์ต๋ ํ์ ๊ตฌ์ฑํ๋ค. [์ํฅ์]
- ์ญ์ ๋ฅผ ํ ๋๋ ๋ฃจํธ ๋ ธ๋๋ฅผ ์ญ์ ํ๊ณ , ๊ฐ์ฅ ๋ง์ง๋ง ์์๋ฅผ ๋ฃจํธ ๋ ธ๋์ ์์น๋ก ์ฎ๊ฒจ์ค๋ค. ์ญ์ ์ดํ์๋ ๋ฆฌํ ๋ ธ๋๊น์ง ๋ด๋ ค๊ฐ๋ฉด์ ์ต๋ ํ์ ๊ตฌ์ฑํ๋ค. [ํํฅ์]
์ฐ์ ์์ ํ ๊ตฌํ
#include <stdio.h>
#define MAX_SIZE 10000
void swap(int *a, int *b){
int temp += *a;
*a = *b;
*b = temp;
}
typedef struct{
int heap[MAX_SIZE];
int count; //์์์ ๊ฐฏ์๋ฅผ ๋ด์ ๋ณ์
} priorityQueue;
//-------------์ฐ์ ์์ ํ์ ์ ์-------------//
void push(priorityQueue *pq, int data){
if(pq->count >= MAX_SIZE) return;
pq->heap[pq->count] = data;
int now = pq->count;
int parent = (pq->count-1)/2;
//์ ์์๋ฅผ ์ฝ์
ํ ์ดํ์ ์ํฅ์์ผ๋ก ํ์ ๊ตฌ์ฑํ๋ค.
//๊ณ์ํด์ ์๋ก ์ฌ๋ผ๊ฐ๋ฉด์ ์์ ์ด ๋ถ๋ชจ๋ณด๋ค ํฌ๋ฉด์ ์๋ฆฌ๋ฅผ ๋ฐ๊พธ๋ ๋ฐฉ์์ผ๋ก
while(now>0 && pq->heap.now > pq->heap[parent]){
swap(&pq->heap[now], &pq->heap[parent]);
now = parent;
parent = (parent-1)/2;
}
pq->count++;
}
int pop(priorityQueue *pq){
if(pq->count <= 0) return -9999; //๋์ด์ ์ถ์ถํ ์์๊ฐ ์๋ ๊ฒฝ์ฐ
int res = pq->heap[0];
pq->count--;
pq->heap[0] = pq->heap[pq->count]; //๋ฃจํธ๋
ธ๋๋ฅผ ๋บ ๋ค์์ ๋ง์ง๋ง ๋ฃจํธ๋
ธ๋๋ฅผ ๋ฃ๋๋ค.
int now = 0, leftChild = 1, rightChild = 2;
int target = now; //ํ๊ฒ์ ๋ฐ๊พธ๊ณ ์ํ๋ ์์ ๋
ธ๋. ์๊ธฐ์์ ์ผ๋ก ์ด๊ธฐํ
//์ ์์๋ฅผ ์ถ์ถํ ์ดํ์ ํํฅ์์ผ๋ก ํ์ ๊ตฌ์ฑํ๋ค.
while(leftChild < pq->count){ //์์๊ฐ ์กด์ฌํ ๋๊น์ง ๋ฐ๋ณต
if(pq->heap[target] < pq->heap[leftChild]) target = leftChild;
if(pq->heap[target] > pq->heap[rightChild] && rightChild < pq->count) target = rightChild;
if(target == now) break; //๋ ์์๋ณด๋ค ์๊ธฐ์์ ์ด ์ ์ผ ํฌ๋ค๋ฉด ๋์ด์ ๋ด๋ ค๊ฐ์ง ์์๋ ๋๋๊น ์ข
๋ฃ
else{
swap(&pq->heap[now], &pq->heap[target]);
now = target;
leftChild = now*2 + 1;
rightChild = now*2 + 2;
}
}
return res;
}
//-------------์ฐ์ ์์ ํ์ ์ฌ์ฉ push, pop-------------//
int main(void){
int n, data;
scanf("%d", %n);
priorityQueue pq;
pq.count = 0;
for(int i=0; i<n; i++){
scanf("%d", &data);
push(&pq, data);
}
for(int i=0; i<n; i++){
int data = pop(&pq);
printf("%d", data)l
}
system("pause");
return 0;
}
'์๋ฃ๊ตฌ์กฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋ฃ๊ตฌ์กฐ] ํธ๋ฆฌ(Tree) (0) | 2020.11.13 |
---|---|
[์๋ฃ๊ตฌ์กฐ] ๋๋น ์ฐ์ ํ์(BFS) (0) | 2020.02.21 |
[์๋ฃ๊ตฌ์กฐ] ๊น์ด ์ฐ์ ํ์(DFS) (0) | 2020.02.21 |
[์๋ฃ๊ตฌ์กฐ] ๊ทธ๋ํ์ ๊ฐ๋ ๊ณผ ๊ตฌํ (0) | 2020.02.21 |