# ํž™(Heap)



# ์•Œ์•„์•ผํ•  ๊ฒƒ

1.ํž™์˜ ๊ฐœ๋…

2.ํž™์˜ ์‚ฝ์ž… ๋ฐ ์‚ญ์ œ


ํž™์€, ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค.

๋จผ์ € ์šฐ์„ ์ˆœ์œ„ ํ์— ๋Œ€ํ•ด์„œ ๊ฐ„๋žตํžˆ ์•Œ์•„๋ณด์ž


์šฐ์„ ์ˆœ์œ„ ํ : ์šฐ์„ ์ˆœ์œ„์˜ ๊ฐœ๋…์„ ํ์— ๋„์ž…ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ

๋ฐ์ดํ„ฐ๋“ค์ด ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ. ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜๊ฐ

์Šคํƒ์€ LIFO, ํ๋Š” FIFO


# ์–ธ์ œ ์‚ฌ์šฉ?

์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ์Šคํ…œ, ์ž‘์—… ์Šค์ผ€์ค„๋ง, ์ˆ˜์น˜ํ•ด์„ ๊ณ„์‚ฐ

์šฐ์„ ์ˆœ์œ„ ํ๋Š” ๋ฐฐ์—ด, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ, ํž™์œผ๋กœ ๊ตฌํ˜„ (ํž™์œผ๋กœ ๊ตฌํ˜„์ด ๊ฐ€์žฅ ํšจ์œจ์ !)

ํž™ โ†’ ์‚ฝ์ž… : O(logn) , ์‚ญ์ œ : O(logn)



# ํž™(Heap)


์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์˜ ์ผ์ข…

์—ฌ๋Ÿฌ ๊ฐ’ ์ค‘, ์ตœ๋Œ€๊ฐ’๊ณผ ์ตœ์†Œ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„๋‚ด๋„๋ก ๋งŒ๋“ค์–ด์ง„ ์ž๋ฃŒ๊ตฌ์กฐ

๋ฐ˜์ •๋ ฌ ์ƒํƒœ

ํž™ ํŠธ๋ฆฌ๋Š” ์ค‘๋ณต๋œ ๊ฐ’ ํ—ˆ์šฉ (์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋Š” ์ค‘๋ณต๊ฐ’ ํ—ˆ์šฉX)


# ํž™ ์ข…๋ฅ˜

# ์ตœ๋Œ€ ํž™(max heap)

๋ถ€๋ชจ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์ด ์ž์‹ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ

# ์ตœ์†Œ ํž™(min heap)

๋ถ€๋ชจ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์ด ์ž์‹ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ


# ๊ตฌํ˜„


ํž™์„ ์ €์žฅํ•˜๋Š” ํ‘œ์ค€์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๋ฐฐ์—ด

๊ตฌํ˜„์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ์ธ๋ฑ์Šค์ธ 0์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ

ํŠน์ • ์œ„์น˜์˜ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋Š” ์ƒˆ๋กœ์šด ๋…ธ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด๋„ ๋ณ€ํ•˜์ง€ ์•Š์Œ

(ex. ๋ฃจํŠธ ๋…ธ๋“œ(1)์˜ ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋Š” ํ•ญ์ƒ 3)


# ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ์ž์‹ ๋…ธ๋“œ ๊ด€๊ณ„

์™ผ์ชฝ ์ž์‹ index = (๋ถ€๋ชจ index) * 2

์˜ค๋ฅธ์ชฝ ์ž์‹ index = (๋ถ€๋ชจ index) * 2 + 1

๋ถ€๋ชจ index = (์ž์‹ index) / 2

# ํž™์˜ ์‚ฝ์ž…

1.ํž™์— ์ƒˆ๋กœ์šด ์š”์†Œ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด, ์ผ๋‹จ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ํž™์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์— ์‚ฝ์ž…

2.์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๋ถ€๋ชจ ๋…ธ๋“œ๋“ค๊ณผ ๊ตํ™˜


# ์ตœ๋Œ€ ํž™ ์‚ฝ์ž… ๊ตฌํ˜„
void insert_max_heap(int x) {
    
    maxHeap[++heapSize] = x; 
    // ํž™ ํฌ๊ธฐ๋ฅผ ํ•˜๋‚˜ ์ฆ๊ฐ€ํ•˜๊ณ , ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์— x๋ฅผ ๋„ฃ์Œ
    
    for( int i = heapSize; i > 1; i /= 2) {
        
        // ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ์ž์‹ ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ํฌ๋ฉด swap
        if(maxHeap[i/2] < maxHeap[i]) {
            swap(i/2, i);
        } else {
            break;
        }
        
    }
}

๋ถ€๋ชจ ๋…ธ๋“œ๋Š” ์ž์‹ ์˜ ์ธ๋ฑ์Šค์˜ /2 ์ด๋ฏ€๋กœ, ๋น„๊ตํ•˜๊ณ  ์ž์‹ ์ด ๋” ํฌ๋ฉด swapํ•˜๋Š” ๋ฐฉ์‹


# ํž™์˜ ์‚ญ์ œ

1.์ตœ๋Œ€ ํž™์—์„œ ์ตœ๋Œ€๊ฐ’์€ ๋ฃจํŠธ ๋…ธ๋“œ์ด๋ฏ€๋กœ ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์‚ญ์ œ๋จ (์ตœ๋Œ€ ํž™์—์„œ ์‚ญ์ œ ์—ฐ์‚ฐ์€ ์ตœ๋Œ€๊ฐ’ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ)

2.์‚ญ์ œ๋œ ๋ฃจํŠธ ๋…ธ๋“œ์—๋Š” ํž™์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ ธ์˜ด

3.ํž™์„ ์žฌ๊ตฌ์„ฑ


# ์ตœ๋Œ€ ํž™ ์‚ญ์ œ ๊ตฌํ˜„
int delete_max_heap() {
    
    if(heapSize == 0) // ๋ฐฐ์—ด์ด ๋น„์–ด์žˆ์œผ๋ฉด ๋ฆฌํ„ด
        return 0;
    
    int item = maxHeap[1]; // ๋ฃจํŠธ ๋…ธ๋“œ์˜ ๊ฐ’์„ ์ €์žฅ
    maxHeap[1] = maxHeap[heapSize]; // ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ ๊ฐ’์„ ๋ฃจํŠธ๋กœ ์ด๋™
    maxHeap[heapSize--] = 0; // ํž™ ํฌ๊ธฐ๋ฅผ ํ•˜๋‚˜ ์ค„์ด๊ณ  ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ 0 ์ดˆ๊ธฐํ™”
    
    for(int i = 1; i*2 <= heapSize;) {
        
        // ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ์™ผ์ชฝ ๋…ธ๋“œ์™€ ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ๋ณด๋‹ค ํฌ๋ฉด ๋
        if(maxHeap[i] > maxHeap[i*2] && maxHeap[i] > maxHeap[i*2+1]) {
            break;
        }
        
        // ์™ผ์ชฝ ๋…ธ๋“œ๊ฐ€ ๋” ํฐ ๊ฒฝ์šฐ, swap
        else if (maxHeap[i*2] > maxHeap[i*2+1]) {
            swap(i, i*2);
            i = i*2;
        }
        
        // ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ๊ฐ€ ๋” ํฐ ๊ฒฝ์šฐ
        else {
            swap(i, i*2+1);
            i = i*2+1;
        }
    }
    
    return item;
    
}


# [์ฐธ๊ณ  ์ž๋ฃŒ]

์ตœ์ข… ์ˆ˜์ • : 12/17/2022, 7:23:59 AM