Skip to content

Latest commit

ย 

History

History
136 lines (84 loc) ยท 4.69 KB

[Data Structure] Heap.md

File metadata and controls

136 lines (84 loc) ยท 4.69 KB

Heap

  1. ๊ฐœ์š”
  2. ๊ฐœ๋…

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

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

    • ๋ฐ์ดํ„ฐ๋“ค์ด ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋ฐ์ดํ„ฐ๊ฐ€ ํ์—์„œ ๋จผ์ € ๋น ์ ธ ๋‚˜๊ฐ„๋‹ค.
  • ์–ธ์ œ ์‚ฌ์šฉ?

    • ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ์Šคํ…œ, ์ž‘์—… ์Šค์ผ€์ค„๋ง, ์ˆ˜์น˜ํ•ด์„ ๊ณ„์‚ฐ.
    • ์šฐ์„  ์ˆœ์œ„ ํ๋Š” ๋ฐฐ์—ด, ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, ํž™์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค. (ํž™์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒŒ ๊ฐ€์žฅ ํšจ์œจ์ ์ด๋‹ค.)
  • ์‹œ๊ฐ„ ๋ณต์žก๋„

    • ์‚ฝ์ž… : O(logN)
    • ์‚ญ์ œ : O(logN)
  • ์Šคํƒ : LIFO, ํ : FIFO

[๊ฐœ๋…]

  • Tree์˜ ํ˜•์‹์„ ์ทจํ•˜๊ณ  ์žˆ์œผ๋ฉฐ Tree ์ค‘์—์„œ๋„ ๋ฐฐ์—ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ (Complete Binary Tree)์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์ด๋‹ค.
  • ์ตœ๋Œ€๊ฐ’ ๋ฐ ์ตœ์†Œ๊ฐ’์„ ์ฐพ์•„๋‚ด๋Š” ์—ฐ์‚ฐ์„ ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์ด๋‹ค.
  • ๋ฐฐ์—ด์— ํŠธ๋ฆฌ์˜ ๊ฐ’์„ ๋„ฃ์–ด์ค„ ๋•Œ๋Š” 0๋ฒˆ์งธ๋Š” ๊ฑด๋„ˆ๋›ฐ๊ณ  1๋ฒˆ์งธ๋ถ€ํ„ฐ ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์‹œ์ž‘๋œ๋‹ค. ์ด์œ ๋Š” ๋…ธ๋“œ์˜ ๊ณ ์œ  ๋ฒˆํ˜ธ์™€ index๋ฅผ ์ผ์น˜์‹œ์ผœ ํ˜ผ๋™์„ ์ค„์ด๊ธฐ ์œ„ํ•จ์ด๋‹ค.
  • ์ค‘๋ณต๋œ ๊ฐ’์„ ํ—ˆ์šฉ. (์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋Š” ์ค‘๋ณต ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ.)
  • ํž™์˜ ์ข…๋ฅ˜๋กœ๋Š” ์ตœ๋Œ€ํž™๊ณผ ์ตœ์†Œํž™์ด ์กด์žฌํ•œ๋‹ค.
    • ์ตœ๋Œ€ํž™ : ๊ฐ ๋…ธ๋“œ์˜ ๊ฐ’์ด ์ž์‹ ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ Complete Binary Tree๋ฅผ ๋งํ•œ๋‹ค.
    • ์ตœ์†Œํž™์€ ์ตœ๋Œ€ํž™์˜ ๋ฐ˜๋Œ€์ด๋‹ค.
    • ์ตœ๋Œ€ํž™์—์„œ๋Š” Root Node์— ์žˆ๋Š” ๊ฐ’์ด ์ œ์ผ ํฌ๋ฏ€๋กœ, ์ตœ๋Œ€๊ฐ’์„ ์ฐพ๋Š”๋ฐ ์†Œ์š”๋˜๋Š” ์—ฐ์‚ฐ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(1)์ด๋‹ค.
    • Complete Binary Tree์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์„ ์ด์šฉํ•ด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•œ Random Access๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • Index ๋ฒˆํ˜ธ๋Š” ๋…ธ๋“œ ๊ฐœ์ˆ˜๊ฐ€ n๊ฐœ์ผ ๋•Œ, i๋ฒˆ์งธ ๋…ธ๋“œ์— ๋Œ€ํ•˜์—ฌ ์™ผ์ชฝ ์ž์‹์€ ix2, ์˜ค๋ฅธ์ชฝ ์ž์‹์€ ix2+1๊ฐ€ ๋œ๋‹ค.

๊ตฌํ˜„

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

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

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

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

  • ์™ผ์ชฝ ์ž์‹ index : (๋ถ€๋ชจ index) * 2
  • ์˜ค๋ฅธ์ชฝ ์ž์‹ index : (๋ถ€๋ชจ index) * 2 + 1
  • ๋ถ€๋ชจ index : (์ž์‹ index) / 2
  1. <ํž™์˜ ์‚ฝ์ž…>
  • ํž™์— ์ƒˆ๋กœ์šด ์š”์†Œ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด, ์ผ๋‹จ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ํž™์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์— ์‚ฝ์ž….
  • ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๊ฒ€์‚ฌํ•ด์„œ ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ๊ตํ™˜ํ•œ๋‹ค.

[์ตœ๋Œ€ ํž™ ์‚ฝ์ž… ๊ตฌํ˜„]

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

๋ถ€๋ชจ ๋…ธ๋“œ : ์ž์‹ ์˜ ์ธ๋ฑ์Šค / 2 ์ด๋ฏ€๋กœ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์™€ ๋น„๊ตํ•˜์—ฌ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ๋” ํฌ๋ฉด ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค.

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

[์ตœ๋Œ€ ํž™ ์‚ญ์ œ ๊ตฌํ˜„]

int delete_map_heap(){
  if(heapSize == 0) return 0; // ๋น„์–ด์žˆ์Œ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ ๋ฆฌํ„ด.
  
  int root = 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;
      // ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ๊ฐ€ ๋” ํฐ ๊ฒฝ์šฐ, swap
    } else {
      swap(i, i * 2 + 1);
      i = i * 2 + 1;
    }
  }
  
  return root;
}

Heapify

  • ๋‘ ๊ฐœ์˜ ์„œ๋ธŒ ํŠธ๋ฆฌ๊ฐ€ ์ตœ๋Œ€ํž™(์ตœ์†Œํž™)์ผ ๋•Œ, root๋ฅผ ํฌํ•จํ•˜๋Š” ์ „์ฒด๊ฐ€ heap์ด ๋˜๋„๋ก ์œ„์น˜๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค.
  • ๋ฃจํŠธ์—์„œ ์ž‘์€ ๊ฐ’์ด ํ˜๋Ÿฌ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค. ์ตœ๋Œ€ํž™์˜ ๊ฒฝ์šฐ root๊ฐ€ child๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋‘ ๊ฐœ์˜ child node ์ค‘ ๊ฐ’์ด ํฐ ๋…ธ๋“œ๋ฅผ root์™€ ๊ต์ฒดํ•˜๊ณ  ๊ต์ฒดํ•  ๋…ธ๋“œ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.