优先队列
优先队列是一个保证最重要的元素永远棑在最前面的队列. 优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。 优先队列可以设置这个队列的最大权重(max-priority)或最小权重(min-priority)以保证在队列中的位置在前或者靠后.
优先队列的使用场景
优先队列是一种非常有用的数据结构,它可以保证在优先队列中,优先级高的元素先出队列.如果定义好最重要的元素,在很多数据处理的时候就不用反复确认哪个数据的权重大或者小.
优先队列的优势
- 模拟一个时间驱动,每个事件给出一个时间戳和你想要的事件是在其时间戳顺序执行。优先级队列可以很容易地找到需要模拟的下一个事件
- 图搜索Dijkstra的算法使用一个优先队列计算最小成本。
- 用于数据压缩,生成压缩树。它总是需要找到两个具有最小频率的节点,这些节点还没有父节点,这个时候优先级就会起到很大的作用.
实现一个优先队列
我们用堆(heap)来实现这个队列,因为堆本身就是优先队列的数据结构,堆比排序数组的性能更高,堆的时间复杂度仅为 O(log n)
public struct PriorityQueue<T> {
private 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)
}
}
extension PriorityQueue where T: Equatable {
public func indexOf(element: T) -> Int? {
return heap.indexOf(element)
}
}