๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

์šฐ์„ ์ˆœ์œ„ ํ(Priority Queue)

์šฐ์„ ์ˆœ์œ„ ํ๋Š” ํž™์„ ์ด์šฉํ•ด์„œ ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„์˜ ์žˆ๋Š” ์š”์†Œ๋ฅผ ํ•ญ์ƒ ์ œ์ผ ์ฒ˜์Œ์— ์œ„์น˜์‹œํ‚ค๋Š” ํŠน๋ณ„ํ•œ ํ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์š”์†Œ๊ฐ€ ํ์—์„œ ์ œ๊ฑฐ๋˜๋ฉด ๊ทธ ๋‹ค์Œ ์šฐ์„ ์ˆœ์œ„์— ์žˆ๋Š” ์š”์†Œ๊ฐ€ ํ์˜ ์ฒซ ์š”์†Œ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. 

์‚ฌ์‹ค ์šฐ์„ ์ˆœ์œ„ ํ๋Š” ํž™์ด ์ „๋ถ€์ธ ์ž๋ฃŒ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ํž™์„ ์•„์ง ๋ชจ๋ฅด์‹ ๋‹ค๋ฉด ์•„๋ž˜ ํฌ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ฝ์–ด์ฃผ์„ธ์š”!

 

์Šค์œ„ํ”„ํŠธ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ 5: ํž™(Heap)

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

jeonyeohun.tistory.com

์šฐ์„ ์ˆœ์œ„ ์„ค์ •

์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ• ์ง€ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    init(_ elements: [T] = [], _ sort: @escaping (T, T) -> Bool) {
        heap = Heap(elements: elements, sortFunction: sort)
    }

์ด ๋•Œ๋ฌธ์— ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ์ž์— ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›์•„ Bool ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํด๋กœ์ €๋ฅผ ๋ฐ›์•„์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์Šค์œ„ํ”„ํŠธ์—์„œ ๋“ฑํ˜ธ์—ฐ์‚ฐ๋„ ์—ญ์‹œ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var pq = PriorityQueue(<)

 

์‚ฝ์ž…(push) - O(logN)

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

 

๋”ฐ๋ผ์„œ ํž™์˜ ์‚ฝ์ž…๊ณผ ๋™์ผํ•œ ์‹œ๊ฐ„๋ณต์žก๋„์ธ O(logN)์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค.

    mutating func push(_ element: T) {
        heap.insert(node: element)
    }

 

์‚ญ์ œ(pop) - O(logN)

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

 

๋”ฐ๋ผ์„œ ํž™์˜ ์‚ญ์ œ์™€ ๋™์ผํ•œ ์‹œ๊ฐ„๋ณต์žก๋„์ธ O(logN)์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค.

    mutating func pop() -> T? {
        return heap.remove()
    }

 

์ „์ฒด ์ฝ”๋“œ

 

 

GitHub - jeonyeohun/Data-Structures-In-Swift: ๐Ÿ‘ท๐Ÿป‍โ™‚๏ธ STL ์™œ ์—†์–ด.. ์Šค์œ„ํ”„ํŠธ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ

๐Ÿ‘ท๐Ÿป‍โ™‚๏ธ STL ์™œ ์—†์–ด.. ์Šค์œ„ํ”„ํŠธ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ. Contribute to jeonyeohun/Data-Structures-In-Swift development by creating an account on GitHub.

github.com

์ž๋ฃŒ๊ตฌ์กฐ ์‹œ๋ฆฌ์ฆˆ์˜ ์ฝ”๋“œ๋“ค์€ ์ด ๋ ˆํฌ์—์„œ ๋ชจ๋‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”!