우선순위 큐

우선순위 큐는 가장 중요한 엘리먼트가 항상 맨 앞에 위치하는 다.

큐는 최대 우선순위 큐(가장 큰 엘리먼트가 먼저) 또는 최소 우선순위 큐(가장 작은 엘리먼트가 먼저)로 구현할 수 있다.

우선순위 큐를 사용하는 이유

우선순위 큐는 많은 수의 항목을 처리해야 하고, 반복적으로 가장 크거나 작은 항목(또는 "가장 중요한" 항목)을 식별해야 하는 알고리즘에 유용하다.

우선순위 큐를 활용할 수 있는 알고리즘 예시는 다음과 같다:

일반 큐나 평범한 배열을 사용하면 다음으로 큰 항목을 찾기 위해 전체 시퀀스를 반복적으로 스캔해야 한다. 우선순위 큐는 이런 작업에 최적화되어 있다.

우선순위 큐를 활용하는 방법

우선순위 큐에서 자주 사용하는 주요 작업:

우선순위 큐 구현 방법

우선순위 큐는 다양한 방식으로 구현할 수 있다:

다음은 힙을 기반으로 한 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가 작성