๐Ÿ’ก (Java) ํž™ Heap ์ž๋ฃŒ๊ตฌ์กฐ ์ •๋ฆฌ

๋ฐ•ํ˜„์•„ยท2025๋…„ 2์›” 4์ผ
0

๊ธฐ์ดˆ

๋ชฉ๋ก ๋ณด๊ธฐ
31/31

๐Ÿ’ก ํž™ Heap ์ •๋ฆฌ

๐Ÿ“Œ ํž™(Heap)์ด๋ž€?

ํž™(Heap)์€ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ(Complete Binary Tree) ๊ธฐ๋ฐ˜์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ์ตœ๋Œ“๊ฐ’ ๋˜๋Š” ์ตœ์†Ÿ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ๋œ ํŠธ๋ฆฌ์ด๋‹ค.
๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์ž์‹ ๋…ธ๋“œ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ์ž‘๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค.

๐Ÿ“Œ ํž™(Heap)์˜ ํŠน์ง•

  1. ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ(Complete Binary Tree)
    ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์„ ์ œ์™ธํ•˜๋ฉด ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฑ„์›Œ์ ธ ์žˆ์–ด์•ผ ํ•จ.
    ์ฆ‰, ๋ฐฐ์—ด(Array)๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์‰ฌ์›€.

  2. Heap Property(ํž™ ์†์„ฑ)
    ์ตœ์†Œ ํž™(Min-Heap) : ๋ถ€๋ชจ ๋…ธ๋“œ โ‰ค ์ž์‹ ๋…ธ๋“œ โ†’ ์ตœ์†Ÿ๊ฐ’์ด ๋ฃจํŠธ(root)์— ์œ„์น˜
    ์ตœ๋Œ€ ํž™(Max-Heap) : ๋ถ€๋ชจ ๋…ธ๋“œ โ‰ฅ ์ž์‹ ๋…ธ๋“œ โ†’ ์ตœ๋Œ“๊ฐ’์ด ๋ฃจํŠธ(root)์— ์œ„์น˜

  3. ๋น ๋ฅธ ์‚ฝ์ž…/์‚ญ์ œ ์—ฐ์‚ฐ
    ์‚ฝ์ž… (O(log N)) : ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ Heapify Up(ํž™ ์ƒํ–ฅ) ์ˆ˜ํ–‰.
    ์‚ญ์ œ (O(log N)) : ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•œ ํ›„ Heapify Down(ํž™ ํ•˜ํ–ฅ) ์ˆ˜ํ–‰.

๐Ÿ“Œ ํž™(Heap)์˜ ์ข…๋ฅ˜

1. ์ตœ์†Œ ํž™ (Min-Heap)

  • ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ํ•ญ์ƒ ์ž์‹๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์Œ.
  • ๋ฃจํŠธ(root)์—๋Š” ์ตœ์†Ÿ๊ฐ’์ด ์œ„์น˜.
  • PriorityQueue(๊ธฐ๋ณธ ์„ค์ •)
       1
     /   \
    3     5
   / \   /
  7   9 6

poll()์„ ํ•˜๋ฉด 1์ด ์ œ๊ฑฐ๋˜๊ณ , ๋‹ค์Œ ์ตœ์†Ÿ๊ฐ’(3)์ด ๋ฃจํŠธ๋กœ ์˜ฌ๋ผ์˜ด.

2. ์ตœ๋Œ€ ํž™ (Max-Heap)

  • ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ํ•ญ์ƒ ์ž์‹๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์Œ.
  • ๋ฃจํŠธ(root)์—๋Š” ์ตœ๋Œ“๊ฐ’์ด ์œ„์น˜.
  • PriorityQueue<>(Collections.reverseOrder()) ์‚ฌ์šฉ
       9
     /   \
    7     6
   / \   /
  3   5 1

poll()์„ ํ•˜๋ฉด 9๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ , ๋‹ค์Œ ์ตœ๋Œ“๊ฐ’(7)์ด ๋ฃจํŠธ๋กœ ์˜ฌ๋ผ์˜ด.

๐Ÿ“Œ ํž™(Heap)์˜ ์—ฐ์‚ฐ (Min-Heap ๊ธฐ์ค€)

๐Ÿ“Œ ํž™(Heap)์˜ ๊ตฌํ˜„ (Java)

1. Min-Heap (์ตœ์†Œ ํž™)

import java.util.PriorityQueue;

public class MinHeapExample {
    public static void main(String[] args) {
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();

        minHeap.add(5);
        minHeap.add(1);
        minHeap.add(8);
        minHeap.add(3);

        System.out.println(minHeap.poll()); // 1
        System.out.println(minHeap.poll()); // 3
        System.out.println(minHeap.poll()); // 5
        System.out.println(minHeap.poll()); // 8
    }
}
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋ฐ”์˜ PriorityQueue๋Š” Min-Heap์œผ๋กœ ๋™์ž‘
  • poll()์„ ํ•˜๋ฉด ์˜ค๋ฆ„์ฐจ์ˆœ(์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ)์œผ๋กœ ์š”์†Œ๊ฐ€ ์ œ๊ฑฐ๋จ

2. Max-Heap (์ตœ๋Œ€ ํž™)

import java.util.PriorityQueue;
import java.util.Collections;

public class MaxHeapExample {
    public static void main(String[] args) {
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());

        maxHeap.add(5);
        maxHeap.add(1);
        maxHeap.add(8);
        maxHeap.add(3);

        System.out.println(maxHeap.poll()); // 8
        System.out.println(maxHeap.poll()); // 5
        System.out.println(maxHeap.poll()); // 3
        System.out.println(maxHeap.poll()); // 1
    }
}
  • Collections.reverseOrder()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Max-Heap์œผ๋กœ ๋™์ž‘
  • poll()์„ ํ•˜๋ฉด ๋‚ด๋ฆผ์ฐจ์ˆœ(ํฐ ๊ฐ’๋ถ€ํ„ฐ)์œผ๋กœ ์š”์†Œ๊ฐ€ ์ œ๊ฑฐ๋จ

๐Ÿ“Œ ํž™(Heap)์˜ ํ™œ์šฉ ์˜ˆ์‹œ

  • ์šฐ์„ ์ˆœ์œ„ ํ(Priority Queue)
    ์ž‘์—… ์Šค์ผ€์ค„๋ง (์˜ˆ: CPU ํ”„๋กœ์„ธ์Šค ์šฐ์„ ์ˆœ์œ„ ์ฒ˜๋ฆฌ)
    ๋„คํŠธ์›Œํฌ ํŒจํ‚ท ์ฒ˜๋ฆฌ (๋จผ์ € ์˜จ ํŒจํ‚ท์„ ๋จผ์ € ์ฒ˜๋ฆฌ)
  • ํž™ ์ •๋ ฌ(Heap Sort)
    O(N log N)์˜ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (ํ€ต ์ •๋ ฌ๊ณผ ๋น„์Šทํ•œ ์„ฑ๋Šฅ)
  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Dijkstraโ€™s Algorithm)
    ์ตœ๋‹จ ๊ฒฝ๋กœ ์ฐพ๊ธฐ์—์„œ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋…ธ๋“œ ์„ ํƒ
  • K๋ฒˆ์งธ ์ตœ๋Œ“๊ฐ’/์ตœ์†Ÿ๊ฐ’ ์ฐพ๊ธฐ
    k๊ฐœ๊นŒ์ง€๋งŒ ์œ ์ง€ํ•˜๋ฉด์„œ poll()์„ ์ด์šฉํ•ด K๋ฒˆ์งธ ์ตœ์†Œ/์ตœ๋Œ€ ๊ฐ’ ์ฐพ๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€