【数据结构与算法 - Swift实现】10 - 优先队列 (Priority Queue)

608 阅读1分钟

【数据结构与算法 - Swift实现】04 - 队列 (Queue)文章里面,我们已经讲过队列,采用先进先出的规则。这边文章我们要学习的是优先队列,根据优先级的高低来决定出队的顺序。

实现

在上一篇文章【数据结构与算法 – Swift实现】09 – 数据结构 堆 (Heap)中,我们了解了堆的特点,最大堆能在 O(1) 时间内得到最大值,最小堆能在 O(1) 时间内得到最小值。优先队列是根据优先级的高低来决定出队的顺序,堆的这个特点非常适合用来实现优先队列。

采用堆实现优先队列比较简单,直接给出实现代码如下:

struct PriorityQueue<Element: Equatable> {
    private var heap: Heap<Element>
    
    init(order: @escaping (Element, Element) -> Bool) {
        heap = Heap(order: order)
    }
    
    var isEmpty: Bool {
        return heap.isEmpty
    }
    
    var peek: Element? {
        return heap.peek
    }
    
    mutating func enqueue(_ element: Element) {
        heap.insert(element)
    }
    
    mutating func dequeue() -> Element? {
        return heap.removePeek()
    }
}

extension PriorityQueue: CustomStringConvertible {
    var description: String {
        return heap.description
    }
}

下面我们来测试一下:

var priorityQueue = PriorityQueue<Int>(order: >)
for i in 1...7 {
    priorityQueue.enqueue(i)
}

while !priorityQueue.isEmpty {
    print(String(describing: priorityQueue.dequeue()))
}

// 结果
Optional(7)
Optional(6)
Optional(5)
Optional(4)
Optional(3)
Optional(2)
Optional(1)

数值较大的先出列,符合我们传入的 order 参数。

欢迎加入我管理的Swift开发群:536353151

完整代码 >>

参考资料

Data Structures and Algorithms in Swift --- raywenderlich.com,如果想看原版书籍,请点击链接购买。