[Data Structure] ๐ ์ฐ์ ์์ ํ์ ํ (Priority Queue & Heap)
๐ ์ฐ์ ์์ํ(priority Queue)๋?
ํ๋ ์ ์
์ ์ถ(FIFO)๊ตฌ์กฐ๋ก์จ, ๋จผ์ ๋ค์ด์จ ๊ฐ์ด ๋จผ์ ๋๊ฐ๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์๋ก์ด ๊ฐ์ด ๋ค์ด์ค๊ฑฐ๋ ๋บ ๋๋ ๋จ์ํ๊ฒ o(1) ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง์ง๋ง, ์ด๋ค ๊ฐ์ด ๋ค์ด์๋์ง ๊ฒ์ฌํ๊ฑฐ๋ ๋น๊ตํ๊ธฐ ์ํด์๋ Queue
์ ๋ชจ๋ ๊ฐ๋ค์ ์ผ์ผ์ด ์ฐพ์๋ด์ผ ํ๊ธฐ ๋๋ฌธ์, o(n) ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.
์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ฐ์ ํ๊ธฐ ์ํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ์์ด ๋ฐ๋ก ์ฐ์ ์์ํ(Priority Queue) ๋ผ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์ฐ์ ์์ํ(Priority Queue) ๋ ์ผ๋ฐ์ ์ผ๋ก ํ(heap)
์ด๋ผ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ํตํด์ ๊ตฌํํ๋ค.
๋ค์์ ์ฐ์ ์์ํ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๋น๊ตํ ํ์ด๋ค.
๐ ํ(heap)์ด๋?
ํ(heap)
์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ฐ์ดํฐ์์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์์ ์ด์ง ํธ๋ฆฌ ํํ์ด๋ค.
- ํ์ ์ผ์ข ์ ๋ฐ์ ๋ ฌ ์ํ(๋์จํ ์ ๋ ฌ ์ํ) ์ด๋ฉฐ ์ต๋ํ๊ณผ ์ต์ํ์ผ๋ก ๋๋์ด์ง๋ค.
- ์ต๋ํ์ ์์๋ ธ๋๋ณด๋ค ๋ถ๋ชจ๋ ธ๋์ ๊ฐ์ด ํฌ๋ค.
- ์ต์ํ์ ๋ถ๋ชจ๋ ธ๋๋ณด๋ค ์์๋ ธ๋์ ๊ฐ์ด ํฌ๋ค.
- ์ค๋ณต์ ํ์ฉํ๋ค.
์ต์ํ์ ๋ฃจํธ๊ฐ์ด ๊ฐ์ฅ ์์ ๊ฐ์ ๊ฐ์ง๊ฒ ๋๋ ํธ๋ฆฌ์ด๋ค.
์ต๋ํ์ ๋ฃจํธ๊ฐ์ด ๊ฐ์ฅ ํฐ ๊ฐ์ ๊ฐ์ง๊ฒ ๋๋ ํธ๋ฆฌ์ด๋ค.
์ต์ํ์ ๊ธฐ์ค์ผ๋ก
- ์ผ์ชฝ ์์ ๋ ธ๋ index = ๋ถ๋ชจ๋ ธ๋ index / 2
- ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋ index = ๋ถ๋ชจ๋ ธ๋ index / 2 + 1
- ๋ถ๋ชจ ๋ ธ๋ index = ๋ถ๋ชจ๋ ธ๋ index / 2
๐ [Java] ์ฐ์ ์์ ํ ๊ตฌํํ๊ธฐ
์ฐ์ ์์ ํ๋ฅผ ์๋ฐ์์ ๊ตฌํ์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ฐฐ์ด์ ํตํด ๊ตฌํํ๋ค.
ํธ์์ 0์ ๋น์๋๊ณ 1๋ถํฐ ์ฐจ๋ก๋๋ก ์ง์ด๋ฃ๋๋ค.
- ์ผ์ชฝ ์์ ๋ ธ๋ index = ๋ถ๋ชจ๋ ธ๋ index / 2
- ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋ index = ๋ถ๋ชจ๋ ธ๋ index / 2 + 1
- ๋ถ๋ชจ ๋ ธ๋ index = ๋ถ๋ชจ๋ ธ๋ index / 2
์ด๋ฅผ ์ฝ๋๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
import java.util.PriorityQueue;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
//๋ฎ์ ์ซ์๊ฐ ์ฐ์ ์์์ธ int ํ ์ฐ์ ์์ ํ ์ ์ธ
PriorityQueue<Integer> priorityQueueLowest = new PriorityQueue<>();
//๋์ ์ซ์๊ฐ ์ฐ์ ์์์ธ int ํ ์ฐ์ ์์ ํ ์ ์ธ
PriorityQueue<Integer> priorityQueueHighest = new PriorityQueue<>(Collections.reverseOrder());
// ์ฝ์
์ฐ์ฐ
// add(value) ๋ฉ์๋์ ๊ฒฝ์ฐ ๋ง์ฝ ์ฝ์
์ ์ฑ๊ณตํ๋ฉด true๋ฅผ ๋ฐํ,
// ํ์ ์ฌ์ ๊ณต๊ฐ์ด ์์ด ์ฝ์
์ ์คํจํ๋ฉด IllegalStateException์ ๋ฐ์
priorityQueueLowest.add(1);
priorityQueueLowest.add(10);
priorityQueueLowest.offer(100);
// ์ญ์ ์ฐ์ฐ
// ์ฒซ๋ฒ์งธ ๊ฐ์ ๋ฐํํ๊ณ ์ ๊ฑฐ ๋น์ด์๋ค๋ฉด null
priorityQueueLowest.poll();
// ์ฒซ๋ฒ์งธ ๊ฐ ์ ๊ฑฐ ๋น์ด์๋ค๋ฉด ์์ธ ๋ฐ์
priorityQueueLowest.remove();
// ์ฒซ๋ฒ์งธ ๊ฐ์ ๋ฐํ๋ง ํ๊ณ ์ ๊ฑฐ ํ์ง๋ ์๋๋ค.
// ํ๊ฐ ๋น์ด์๋ค๋ฉด null์ ๋ฐํ
priorityQueueLowest.peek();
// ์ฒซ๋ฒ์งธ ๊ฐ์ ๋ฐํ๋ง ํ๊ณ ์ ๊ฑฐ ํ์ง๋ ์๋๋ค.
// ํ๊ฐ ๋น์ด์๋ค๋ฉด ์์ธ ๋ฐ์
priorityQueueLowest.element();
// ์ด๊ธฐํ
priorityQueueLowest.clear();
}
๐ ๊ด๋ จ ์์
tag:Priority Queue
๊ฐ์ธ ๊ณต๋ถ ๊ธฐ๋ก์ฉ ๋ธ๋ก๊ทธ์
๋๋ค.
ํ๋ฆฌ๊ฑฐ๋ ์ค๋ฅ๊ฐ ์์ ๊ฒฝ์ฐ ์ ๋ณดํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.๐