1 minute read

๐Ÿ“˜ ์šฐ์„ ์ˆœ์œ„ํ(priority Queue)๋ž€?

ํ๋Š” ์„ ์ž…์„ ์ถœ(FIFO)๊ตฌ์กฐ๋กœ์จ, ๋จผ์ € ๋“ค์–ด์˜จ ๊ฐ’์ด ๋จผ์ € ๋‚˜๊ฐ€๊ฒŒ ๋œ๋‹ค.
๋”ฐ๋ผ์„œ ์ƒˆ๋กœ์šด ๊ฐ’์ด ๋“ค์–ด์˜ค๊ฑฐ๋‚˜ ๋บ„ ๋•Œ๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ o(1) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€์ง€๋งŒ, ์–ด๋–ค ๊ฐ’์ด ๋“ค์–ด์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ฑฐ๋‚˜ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Queue ์˜ ๋ชจ๋“  ๊ฐ’๋“ค์„ ์ผ์ผ์ด ์ฐพ์•„๋ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, o(n) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

์ด๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ๋ฐ”๋กœ ์šฐ์„ ์ˆœ์œ„ํ(Priority Queue) ๋ผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
์šฐ์„ ์ˆœ์œ„ํ(Priority Queue) ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํž™(heap) ์ด๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด์„œ ๊ตฌํ˜„ํ•œ๋‹ค.
๋‹ค์Œ์€ ์šฐ์„ ์ˆœ์œ„ํ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋น„๊ตํ•œ ํ‘œ์ด๋‹ค.

image


๐Ÿ“– ํž™(heap)์ด๋ž€?

ํž™(heap) ์ด๋ž€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

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

image

์ตœ์†Œํž™์€ ๋ฃจํŠธ๊ฐ’์ด ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋Š” ํŠธ๋ฆฌ์ด๋‹ค.
์ตœ๋Œ€ํž™์€ ๋ฃจํŠธ๊ฐ’์ด ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋Š” ํŠธ๋ฆฌ์ด๋‹ค.

์ตœ์†Œํž™์„ ๊ธฐ์ค€์œผ๋กœ

  • ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ index = ๋ถ€๋ชจ๋…ธ๋“œ index / 2
  • ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ index = ๋ถ€๋ชจ๋…ธ๋“œ index / 2 + 1
  • ๋ถ€๋ชจ ๋…ธ๋“œ index = ๋ถ€๋ชจ๋…ธ๋“œ index / 2


๐Ÿ“– [Java] ์šฐ์„ ์ˆœ์œ„ ํ ๊ตฌํ˜„ํ•˜๊ธฐ

์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ž๋ฐ”์—์„œ ๊ตฌํ˜„์„ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐฐ์—ด์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•œ๋‹ค.
ํŽธ์˜์ƒ 0์„ ๋น„์›Œ๋†“๊ณ  1๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ง‘์–ด๋„ฃ๋Š”๋‹ค.

image

  • ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ 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



๊ฐœ์ธ ๊ณต๋ถ€ ๊ธฐ๋ก์šฉ ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
ํ‹€๋ฆฌ๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์ œ๋ณดํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.๐Ÿ˜