[자료ꡬ쑰] μš°μ„ μˆœμœ„ν(Priority Queue)λž€?

2022. 12. 15. 17:07Β·πŸ“š 자료ꡬ쑰 및 μ•Œκ³ λ¦¬μ¦˜/큐
728x90

μš°μ„ μˆœμœ„νλž€

νλŠ” λ¨Όμ € λ“€μ–΄μ˜€λŠ” 데이터가 λ¨Όμ € λ‚˜κ°€λŠ” FIFO ν˜•μ‹μ˜ μžλ£Œκ΅¬μ‘°μ΄λ‹€. ν•˜μ§€λ§Œ μš°μ„ μˆœμœ„νλŠ” λ¨Όμ € λ“€μ–΄μ˜€λŠ” 데이터가 μ•„λ‹ˆλΌ μš°μ„ μˆœμœ„κ°€ 높은 데이터가 λ¨Όμ € λ‚˜κ°€λŠ” ν˜•νƒœμ˜ μžλ£Œκ΅¬μ‘°μ΄λ‹€.

 

μš°μ„ μˆœμœ„ν κ΅¬ν˜„λ°©λ²•

  • 배열을 μ΄μš©ν•œ μš°μ„ μˆœμœ„ 큐
  • μ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό μ΄μš©ν•œ μš°μ„ μˆœμœ„ 큐
  • νž™μ„ μ΄μš©ν•œ μš°μ„ μˆœμœ„ 큐

λ°°μ—΄κ³Ό μ—°κ²°λ¦¬μŠ€νŠΈλŠ” μ„ ν˜• ꡬ쑰의 μžλ£Œκ΅¬μ‘°μ΄λ―€λ‘œ μ‚½μž… λ„λŠ” μ‚­μ œ 연산을 μœ„ν•œ μ‹œκ°„λ³΅μž‘λ„λŠ” O(n)이닀.

반면 νž™νŠΈλ¦¬λŠ” μ™„μ „μ΄μ§„νŠΈλ¦¬ κ΅¬μ‘°μ΄λ―€λ‘œ νž™νŠΈλ¦¬μ˜ λ†’μ΄λŠ” logβ‚‚(n+1)  이며, νž™μ˜ μ‹œκ°„λ³΅μž‘λ„λŠ” O(logβ‚‚n)이닀. 이 κΈ€μ—μ„œλŠ” νž™μ„ μ΄μš©ν•˜μ—¬ μš°μ„ μˆœμœ„ 큐λ₯Ό κ΅¬ν˜„ν•΄λ³΄κ² λ‹€. νž™μ— κ΄€ν•œ λ‚΄μš©μ€ μ•„λž˜ 글을 μ°Έκ³ ν•˜μž.

 

[자료ꡬ쑰] νž™(Heap)μ΄λž€?

νž™μ΄λž€? μ™„μ „μ΄μ§„νŠΈλ¦¬μ˜ 일쒅이닀. νž™μ€ μ€‘λ³΅λœ 값을 ν—ˆμš©ν•œλ‹€. μ—¬λŸ¬ κ°’λ“€ 쀑 μ΅œλŒ€κ°’ ν˜Ήμ€ μ΅œμ†Œκ°’μ„ λΉ λ₯΄κ²Œ μ°Ύμ•„λ‚΄κΈ° μœ„ν•œ μžλ£Œκ΅¬μ‘°μ΄λ‹€. Max heap은 κ°€μž₯ 큰 값을 λΉ λ₯΄κ²Œ μ°ΎκΈ° μœ„ν•œ 것이고 Min Heap

linerate.tistory.com


 

 

μš°μ„ μˆœμœ„ν ADT

  • create(): μš°μ„ μˆœμœ„νλ₯Ό μƒμ„±ν•œλ‹€.
  • init(q): μš°μ„ μˆœμœ„ν qλ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€.
  • is_empty(): μš°μ„ μˆœμœ„ν qκ°€ λΉ„μ—ˆλŠ”μ§€ κ²€μ‚¬ν•œλ‹€.
  • is_full(): μš°μ„ μˆœμœ„ν qκ°€ 가득 μ°ΌλŠ”μ§€ κ²€μ‚¬ν•œλ‹€.
  • insert(q, x): μš°μ„ μˆœμœ„ν q에 μš”μ†Œ xλ₯Ό μΆ”κ°€ν•œλ‹€.
  • delete(q): μš°μ„ μˆœμœ„νλ‘œλΆ€ν„° κ°€μž₯ μš°μ„ μˆœμœ„κ°€ 높은 μš”μ†Œλ₯Ό μ‚­μ œν•˜κ³  λ°˜ν™˜ν•œλ‹€.
  • find(q): μš°μ„  μˆœμœ„κ°€ κ°€μž₯ 높은 μš”μ†Œλ₯Ό λ°˜ν™˜ν•œλ‹€.

κ°€μž₯ μ€‘μš”ν•œ 연산은 insertμ—°μ‚°κ³Ό delete연산이닀. μš°μ„ μˆœμœ„νλŠ” μ΅œμ†Œμ™€ μ΅œλŒ€ 2κ°€μ§€λ‘œ 이루어진닀.


 

 

μš°μ„ μˆœμœ„ν νž™

  • 배열을 μ΄μš©ν•œ 방법은 λͺ¨λ“  이진 트리λ₯Ό 포화 이진 트리라고 κ°€μ •ν•˜κ³  각 λ…Έλ“œμ— 번호λ₯Ό λΆ™μ—¬μ„œ κ·Έ 번호λ₯Ό λ°°μ—΄μ˜ 인덱슀둜 μ‚Όμ•„ λ…Έλ“œμ˜ 데이터λ₯Ό 배열에 μ €μž₯ν•˜λŠ” 방법이닀.
  • n의 λΆ€λͺ¨ λ…Έλ“œμ˜ 인덱슀(index)λŠ” n/2
  • n의 μ™Όμͺ½ μžμ‹ λ…Έλ“œμ˜ μΈλ±μŠ€λŠ” 2n
  • n의 였λ₯Έμͺ½ μžμ‹ λ…Έλ“œμ˜ μΈλ±μŠ€λŠ” 2n + 1

 

 

μš°μ„ μˆœμœ„ν μ‚½μž…

νž™μ— μ‚½μž…μ„ ν•˜κΈ° μœ„ν•΄μ„œλŠ” νž™ 트리의 μ„±μ§ˆμ„ λ§Œμ‘±μ‹œν‚€λ©΄μ„œ μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.

  1. μš°μ„  μ™„μ „μ΄μ§„νŠΈλ¦¬μ˜ λ§ˆμ§€λ§‰ λ…Έλ“œμ— μ΄μ–΄μ„œ μƒˆλ‘œμš΄ λ…Έλ“œλ₯Ό μΆ”κ°€ν•œλ‹€.
  2. μΆ”κ°€λœ μƒˆλ‘œμš΄ λ…Έλ“œλ₯Ό λΆ€λͺ¨μ˜ λ…Έλ“œμ™€ λΉ„κ΅ν•˜μ—¬ κ΅ν™˜ν•œλ‹€.
  3. 정상적인 νž™νŠΈλ¦¬κ°€ 될 λ•Œ κΉŒμ§€ (더이상 λΆ€λͺ¨λ…Έλ“œμ™€ κ΅ν™˜ν•  ν•„μš”κ°€ 없을 λ•ŒκΉŒμ§€) 2λ²ˆμ„ λ°˜λ³΅ν•œλ‹€.

μ΅œμ•…μ˜ 경우 μƒˆλ‘œ μΆ”κ°€λœ λ…Έλ“œκ°€ λ£¨νŠΈλ…ΈνŠΈκΉŒμ§€ λΉ„κ΅ν•˜λ©° μ˜¬λΌκ°€μ•Ό ν•˜λ―€λ‘œ μ‹œκ°„λ³΅μž‘λ„κ°€ O(logβ‚‚n)이닀.


 

 

μš°μ„ μˆœμœ„ν μ‚­μ œ

νž™ νŠΈλ¦¬μ—μ„œ λ£¨νŠΈλ…Έλ“œκ°€ κ°€μž₯ μš°μ„ μˆœμœ„κ°€ λ†’μœΌλ―€λ‘œ 루트 λ…Έλ“œλ₯Ό μ‚­μ œν•΄μ•Ό ν•œλ‹€.

μ‚­μ œκ°€ 이뀄진 ν›„ νž™ 트리의 μ„±μ§ˆμ΄ μœ μ§€λΌμ•Ό ν•˜λ―€λ‘œ μ•„λž˜μ™€ 같은 λ°©λ²•μœΌλ‘œ μ‚­μ œλ₯Ό μ§„ν–‰ν•œλ‹€.

  1. 루트 λ…Έλ“œλ₯Ό μ‚­μ œν•œλ‹€.
  2. 루트 λ…Έλ“œκ°€ μ‚­μ œλœ λΉˆμžλ¦¬μ— μ™„μ „μ΄μ§„νŠΈλ¦¬μ˜ λ§ˆμ§€λ§‰ λ…Έλ“œλ₯Ό κ°€μ Έμ˜¨λ‹€.
  3. 루트 μžλ¦¬μ— μœ„μΉ˜ν•œ μƒˆλ‘œμš΄ λ…Έλ“œλ₯Ό μžμ‹ λ…Έλ“œμ™€ λΉ„κ΅ν•˜μ—¬ κ΅ν™˜ν•œλ‹€.
    μ΄λ•Œ μ΅œλŒ€ νž™μΈ 경우 μžμ‹λ…Έλ“œ 쀑 더 큰 κ°’κ³Ό κ΅ν™˜μ„ ν•˜λ©°, μ΅œμ†Œ νž™μΈ 경우 더 μž‘μ€ κ°’κ³Ό κ΅ν™˜μ„ ν•œλ‹€.
  4. 정상적인 νž™νŠΈλ¦¬κ°€ 될 λ•ŒκΉŒμ§€ (더 이상 μžμ‹λ…Έλ“œμ™€ κ΅ν™˜ν•  ν•„μš”κ°€ 없을 λ•ŒκΉŒμ§€) 3λ²ˆμ„ λ°˜λ³΅ν•œλ‹€.

μ‚­μ œ μ—°μ‚° λ˜ν•œ μ΅œμ•…μ˜ 경우 λ£¨νŠΈλ…ΈνŠΈλΆ€ν„° κ°€μž₯ μ•„λž˜κΉŒμ§€ λ‚΄λ €κ°€μ•Ό ν•˜λ―€λ‘œ μ‹œκ°„λ³΅μž‘λ„κ°€ O(logβ‚‚n)이닀.


 

 

전체 μ½”λ“œ

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define MAX_SIZE 200
typedef struct {
    int key;
} element;

typedef struct {
    element heap[MAX_SIZE];
    int heap_size = 0;
}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){
        if((child < h->heap_size) && (h->heap[child].key) < h->heap[child + 1].key){
            child++;
        }
        if(temp.key > h->heap[child].key)
            break;
        h->heap[parent] = h->heap[child];
        child *= 2;
    }
    h->heap[parent] = temp;
    return item;
}



int main(void){
    element  e1 = {40}, e2 = { 5}, e3 = {30};
    element e4,e5,e6;
    HeapType* heap;

    heap = create();
    init(heap);

    insert_max_heap(heap, e1);
    insert_max_heap(heap, e2);
    insert_max_heap(heap, e3);

    e4 = delete_max_heap(heap);
    printf("<%d>", e4.key);
    e5 = delete_max_heap(heap);
    printf("<%d>", e5.key);
    e6 = delete_max_heap(heap);
    printf("<%d>", e6.key);

    free(heap);
    return 0;
}
728x90
μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ“š 자료ꡬ쑰 및 μ•Œκ³ λ¦¬μ¦˜/큐' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [자료ꡬ쑰] 덱(deque)μ΄λž€?
  • [자료ꡬ쑰] μ›ν˜• 큐(Circular Queue)λž€?
  • [자료ꡬ쑰] 큐(Queue)λž€?
juno1105
juno1105
κ³΅λΆ€ν•˜λŠ” κ²Έ 포폴 λΈ”λ‘œκ·Έ
  • juno1105
    @juno1105
    juno1105
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (89)
      • πŸ’¬ 자유 (3)
      • πŸ“– μ–΄ν•™ 곡뢀 (0)
      • πŸ“” 개발 ν”„λ‘œμ νŠΈ (4)
      • πŸ›  ν”„λ‘œκ·Έλž¨ 였λ₯˜ 해결법 (1)
      • πŸ“š 자료ꡬ쑰 및 μ•Œκ³ λ¦¬μ¦˜ (53)
        • μŠ€νƒ (4)
        • 큐 (4)
        • μ •λ ¬ 및 탐색 (17)
        • 리슀트 (5)
        • ν•΄μ‹œ (1)
        • 트리 (8)
        • νž™ (2)
        • κ·Έλž˜ν”„ (12)
      • πŸ’» 컴퓨터 ꡬ쑰 (0)
      • πŸš₯ λ…Όλ¦¬νšŒλ‘œ (8)
      • πŸ”° λ°±μ€€ (20)
        • 큐, μŠ€νƒ, 덱 (0)
        • DFS 와 BFS (3)
        • 그리디 (0)
        • λ™μ κ³„νšλ²• 1 (16)
        • λ™μ κ³„νšλ²• 2 (0)
        • μ΅œλ‹¨ 경둜 (0)
        • 트리 (0)
        • λ°±νŠΈλž˜ν‚Ή (0)
        • μœ λ‹ˆμ˜¨ νŒŒμΈλ“œ (0)
        • μ§‘ν•©κ³Ό λ§΅ (1)
      • 🌈 ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ (0)
      • πŸ“± μ•ˆλ“œλ‘œμ΄λ“œ μ•± (0)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

    • ✨자료ꡬ쑰 μ•Œκ³ λ¦¬μ¦˜ 컀리큘럼✨
  • 인기 κΈ€

  • νƒœκ·Έ

    μ •λ ¬ μ΅œμ•…μ˜ 경우
    토읡 910점
    κ·Έλž˜ν”„νƒμƒ‰
    μ •λ ¬ μ΅œμ„ μ˜ 경우
    토읡 900
    토읡 920점
    λΉ…μ˜€ν‘œκΈ°λ²•
    토읡 900점
    μ‹œκ°„λ³΅μž‘λ„
    μ΅œλ‹¨κ²½λ‘œ
    토읡
    토읡 950점
    μ •λ ¬
    μ•Œκ³ λ¦¬μ¦˜
    토읡 900μ λŒ€
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
juno1105
[자료ꡬ쑰] μš°μ„ μˆœμœ„ν(Priority Queue)λž€?
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”