๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ/ํŠธ๋ฆฌ

[์ž๋ฃŒ๊ตฌ์กฐ] ํž™(Heap)

Amenable 2023. 3. 10. 22:31

1. ์ •์˜ ๐Ÿณ

  ํž™(Heap)์ด๋ž€ ์—ฌ๋Ÿฌ ๊ฐ’๋“ค ์ค‘ ์ตœ๋Œ“๊ฐ’ ํ˜น์€ ์ตœ์†Ÿ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„๋‚ด๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. 

ํž™์˜ ํŠน์ง•

  • ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ์˜ ์ผ์ข…์ด๋‹ค. 
  • ๋ฐ˜์ •๋ ฌ ์ƒํƒœ์ด๋‹ค.
    ์ตœ๋Œ€ํž™(Max Heap) ๋˜๋Š” ์ตœ์†Œํž™(Min Heap)์— ๋”ฐ๋ผ์„œ ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ํ•ญ์ƒ ๊ฐ€์žฅ ํฐ ๊ฐ’์ด๊ฑฐ๋‚˜ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์œ ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์ค‘๋ณต๋œ ๊ฐ’์„ ํ—ˆ์šฉํ•œ๋‹ค.

ํž™์˜ ์ข…๋ฅ˜

  • ์ตœ๋Œ€ ํž™ (Max Heap)
    ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์ด ์ž์‹ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ ํ˜•์‹
  • ์ตœ์†Œ ํž™ (Min Heap)
    ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์ด ์ž์‹ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ ํ˜•์‹

 

2. ๋™์ž‘ ๋ฐฉ์‹ ๐ŸŸ

์ธ๋ฑ์Šค 0 1 2 3 4 5 6 7 8
๊ฐ’ - 9 7 6 4 5 1 3 8

  Heap์€ ๋ฐฐ์—ด์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ ์ด์œ ๋Š” ํž™์ด ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์— ๊ฐ’์„ ์ˆœ์„œ๋Œ€๋กœ ๋„ฃ์œผ๋ฉด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

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

  ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ '๋ถ€๋ชจ ๋…ธ๋“œ์™€ ์ž์‹ ๋…ธ๋“œ์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„์™€ ๊ฐ™์€ ์‰ฌ์šด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์œ„ํ•ด 0๋ฒˆ ์ธ๋ฑ์Šค๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. 

  Heap์˜ '์‚ฝ์ž… ๋ฐฉ์‹'๊ณผ '์‚ญ์ œ ๋ฐฉ์‹'์„ ํ†ตํ•ด ํž™์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์•Œ์•„๋ณด์ž.

1. ์‚ฝ์ž…

  ์‚ฝ์ž…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

  1. ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ํž™์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์— ์ด์–ด์„œ ์‚ฝ์ž…ํ•œ๋‹ค.
    ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰์— ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  2. ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ๋น„๊ตํ•˜๋ฉด์„œ ๊ตํ™˜์„ ํ•œ๋‹ค.
    ์ตœ๋Œ€ ํž™์˜ ๊ฒฝ์šฐ, ์ถ”๊ฐ€ํ•œ ๊ฐ’์ด ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ํฌ๋ฉด ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พผ๋‹ค.
    ์ตœ์†Œ ํž™์˜ ๊ฒฝ์šฐ, ์ถ”๊ฐ€ํ•œ ๊ฐ’์ด ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ์ž‘์œผ๋ฉด ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พผ๋‹ค.
  3. 2๋ฒˆ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

  ์ตœ๋Œ€ ํž™์—์„œ์˜ ์‚ฝ์ž…์„ ๊ทธ๋ฆผ์„ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž.

  7๋ฒˆ ์ธ๋ฑ์Šค๊นŒ์ง€ ์žˆ๋Š” ์ตœ๋Œ€ํž™์— 8์ด๋ผ๋Š” ์ˆซ์ž๋ฅผ ์‚ฝ์ž…ํ•ด ๋ณด์ž. ์œ„์˜ ๋™์ž‘๋ฐฉ์‹๊ณผ ์•„๋ž˜์˜ ๊ทธ๋ฆผ์˜ ํ๋ฆ„์„ ์ž˜ ๋”ฐ๋ผ๊ฐ„๋‹ค๋ฉด ์ดํ•ด๋ฅผ ํ•˜๋Š”๋ฐ ํฐ ๋ฌด๋ฆฌ๊ฐ€ ์—†์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

  ์™„์„ฑ๋œ ๋ชจ์Šต์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

2. ์‚ญ์ œ

  ํž™์—์„œ์˜ ์‚ญ์ œ๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ์ตœ๋Œ€ํž™์ด๋ผ๋ฉด ์ตœ๋Œ“๊ฐ’์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด๊ณ  ์ตœ์†Œํž™์ด๋ผ๋ฉด ์ตœ์†Ÿ๊ฐ’์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ๋ฃจํŠธ๋…ธ๋“œ์—์„œ ๊ฐ’์„ ์ œ๊ฑฐํ•œ๋‹ค.
  2. ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ์˜ฎ๊ธด๋‹ค.
  3. ์ž์‹ ๋…ธ๋“œ์™€ ๋Œ€์†Œ๊ด€๊ณ„๋ฅผ ๋น„๊ตํ•œ๋‹ค.
    ์ตœ๋Œ€ ํž™์˜ ๊ฒฝ์šฐ, ์ž์‹ ๋…ธ๋“œ ์ค‘์—์„œ ๋” ํฐ ๋…ธ๋“œ์™€ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พผ๋‹ค.
    ์ตœ์†Œ ํž™์˜ ๊ฒฝ์šฐ, ์ž์‹ ๋…ธ๋“œ ์ค‘์—์„œ ๋” ์ž‘์€ ๋…ธ๋“œ์™€ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พผ๋‹ค.
  4. 3๋ฒˆ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

  ์ตœ๋Œ€ํž™์—์„œ์˜ ์‚ญ์ œ๋ฅผ ๊ทธ๋ฆผ์„ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž. 11๋ฒˆ ์ธ๋ฑ์Šค๊นŒ์ง€ ์žˆ๋Š” ์ตœ๋Œ€ํž™์—์„œ ์‚ญ์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค๊ณ  ํ•˜์ž. ์ด๊ฒƒ ๋˜ํ•œ ๋™์ž‘ ๋ฐฉ์‹๊ณผ ๊ทธ๋ฆผ์˜ ํ๋ฆ„์„ ์ž˜ ๋”ฐ๋ผ๊ฐ„๋‹ค๋ฉด ์ดํ•ด๋ฅผ ํ•˜๋Š”๋ฐ ํฐ ๋ฌด๋ฆฌ๊ฐ€ ์—†์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐ๋œ๋‹ค.

  ์™„์„ฑ๋œ ๋ชจ์Šต์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

3. ๊ตฌํ˜„(JAVA) ๐Ÿฌ

  ์‚ฝ์ž…๊ณผ ์‚ญ์ œ์—์„œ์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž. 

1. ์‚ฝ์ž…

static void insert_max_heap(int x) {

    // ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์— ์›์†Œ x๋ฅผ ์ถ”๊ฐ€
    maxHeap[++heapSize] = x;

    for(int i = heapSize; i > 1; i /= 2) {

        // ์ž์‹๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ๋…ธ๋“œ๋ณด๋‹ค ๋” ํฐ ๊ฒฝ์šฐ ์ž๋ฆฌ ๊ตํ™˜
        if(maxHeap[i / 2]  < maxHeap[i]) {
            swap(i / 2, i);
        }
        else {
            break;
        }
    }
}

2. ์‚ญ์ œ

static int delete_max_heap() {
    // ๋ฐฐ์—ด์ด ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ
    if(heapSize == 0)
        return -1;

    //์‚ญ์ œํ•  ๋…ธ๋“œ ์ €์žฅ(๋ฆฌํ„ด์„ ์œ„ํ•œ ๊ฒƒ)
    int item = maxHeap[1];
    // ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ์˜ฎ๊ธด๋‹ค.
    maxHeap[1] = maxHeap[heapSize];
    maxHeap[heapSize--] = 0;

    for(int i = 1; i * 2 <= heapSize;) {
        // ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ์ž์‹ ๋…ธ๋“œ๋“ค๋ณด๋‹ค ๋” ํฐ ๊ฒฝ์šฐ
        if(maxHeap[i] > maxHeap[i * 2]
                && maxHeap[i] > maxHeap[i * 2 + 1]) {
            break;
        }
        // ์™ผ์ชฝ ๋…ธ๋“œ๊ฐ€ ๋” ํฐ ๊ฒฝ์šฐ
        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;
}

 

ํ•ด๋‹น ๊ธ€์€
์ฝ”๋“œ ์—ฐ๊ตฌ์†Œ์˜ '[์ž๋ฃŒ๊ตฌ์กฐ]Max Heap, Min Heap, Heap ์ด๋ž€? | C์–ธ์–ด Heap ๊ตฌํ˜„',
Passwd๋‹˜์˜ '์ตœ์†Œ ํž™/ ์ตœ๋Œ€ ํž™',
Gyoogle๋‹˜์˜ 'ํž™(Heap)'
์„ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.