๐Ÿ’ป

[์ž๋ฃŒ๊ตฌ์กฐ] ์šฐ์„ ์ˆœ์œ„ ํ ๋ณธ๋ฌธ

์ž๋ฃŒ๊ตฌ์กฐ

[์ž๋ฃŒ๊ตฌ์กฐ] ์šฐ์„ ์ˆœ์œ„ ํ

๋˜ํšจ๋‹ˆ 2020. 2. 18. 17:57

์šฐ์„ ์ˆœ์œ„ ํ๋Š” '์šฐ์„  ์ˆœ์œ„'๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋“ค์„ ์ €์žฅํ•˜๋Š” ํ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ผ ๋•Œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜์˜จ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์–ด์„œ ๋งŽ์ด ํ™œ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

์šฐ์„ ์ˆœ์œ„ ํ๋Š” ์šด์˜์ฒด์ œ์˜ ์ž‘์—…์Šค์ผ€์ค„๋ง, ์ •๋ ฌ, ๋„คํŠธ์›Œํฌ ๊ด€๋ฆฌ ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ์— ์ ์šฉ๋˜๊ณ  ์žˆ๋‹ค. 

์šฐ์„ ์ˆœ์œ„ ํ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” 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;
}

 

 

๋ฐ˜์‘ํ˜•
Comments