우선순위 큐는 가장 중요한 엘리먼트가 항상 맨 앞에 위치하는 큐다.
큐는 최대 우선순위 큐(가장 큰 엘리먼트가 먼저) 또는 최소 우선순위 큐(가장 작은 엘리먼트가 먼저)로 구현할 수 있다.
우선순위 큐는 많은 수의 항목을 처리해야 하고, 반복적으로 가장 크거나 작은 항목(또는 "가장 중요한" 항목)을 식별해야 하는 알고리즘에 유용하다.
우선순위 큐를 활용할 수 있는 알고리즘 예시는 다음과 같다:
일반 큐나 평범한 배열을 사용하면 다음으로 큰 항목을 찾기 위해 전체 시퀀스를 반복적으로 스캔해야 한다. 우선순위 큐는 이런 작업에 최적화되어 있다.
우선순위 큐에서 자주 사용하는 주요 작업:
우선순위 큐는 다양한 방식으로 구현할 수 있다:
다음은 힙을 기반으로 한 Swift 우선순위 큐 예제다:
public struct PriorityQueue<T> {
fileprivate var heap: Heap<T>
public init(sort: (T, T) -> Bool) {
heap = Heap(sort: sort)
}
public var isEmpty: Bool {
return heap.isEmpty
}
public var count: Int {
return heap.count
}
public func peek() -> T? {
return heap.peek()
}
public mutating func enqueue(element: T) {
heap.insert(element)
}
public mutating func dequeue() -> T? {
return heap.remove()
}
public mutating func changePriority(index i: Int, value: T) {
return heap.replace(index: i, value: value)
}
}
보는 바와 같이, 우선순위 큐를 만드는 것은 간단하다. 힙이 있다면 우선순위 큐를 쉽게 만들 수 있다. 왜냐하면 힙은 기본적으로 우선순위 큐이기 때문이다.
Swift 알고리즘 클럽을 위해 Matthijs Hollemans가 작성