优先级堆 (PriorityHeap)

PriorityHeap 是一个 Swift 数据结构,扩展了 Heap 数据结构的功能,后者来自 swift-collections 包。 它利用 Prioritizable 协议,允许元素根据其固有的优先级进行排序。 当元素本身无法直接比较,或者您想根据特定属性对元素进行排序时,这尤其有用。

PriorityHeapModule

PriorityHeapModule 提供了一个 PriorityHeap 数据结构,它利用 Prioritizable 协议来根据元素的固有优先级进行管理。

Prioritizable

Prioritizable 协议定义如下:

public protocol Prioritizable {
    associatedtype Priority: Comparable
    var priority: Priority { get }
}

要将 Prioritizable 一致性添加到您的自定义类型,您需要指定一个符合 Comparable 的关联类型,并提供一个 priority 属性。 这是一个例子:

struct WorkItem: Prioritizable {
    typealias Priority = Int

    let description: String
    let priority: Priority
}

优先级堆 (PriorityHeap)

PriorityHeap 是一个 Min-Max Heap 数据结构,其中的排序基于元素的优先级。 它提供了插入元素的方法,以及检索和删除具有最高和最低优先级的元素的方法。

这是一个如何使用的例子:

var workHeap = PriorityHeap<WorkItem>()
workHeap.insert(WorkItem(description: "Do laundry", priority: 2))
workHeap.insert(WorkItem(description: "Buy groceries", priority: 1))
workHeap.insert(WorkItem(description: "Pick up kids from school", priority: 3))

while let workItem = workHeap.popMax() {
    print(workItem.description)
}
// Prints "Pick up kids from school"
// Prints "Do laundry"
// Prints "Buy groceries"

在此示例中,popMax() 方法用于按优先级降序检索工作项。

PriorityHeapAlgorithms

PriorityHeapAlgorithms 模块通过其他实用程序扩展了 PriorityHeap 的功能,这些实用程序简化了涉及优先级堆的常见操作。

合并操作 (Merged Operations)

PriorityHeapAlgorithms 模块通过提供比较和操作多个优先级堆的实用程序来增强 PriorityHeap 的功能。 它允许您确定两个堆中哪个堆具有优先级较低或较高的元素,并执行诸如检索或删除跨堆的最小或最大元素之类的操作。 当您需要在单独的集合中维护全局排序或优先级时,例如在保持优先级顺序的同时合并来自不同队列的任务时,这尤其有用。

例如,考虑两个优先级堆,代表公司不同部门的任务:

if let mostUrgentTask = PriorityHeap.popMax(&engineeringHeap, &marketingHeap) {
    print("Most urgent task: \(mostUrgentTask.description)")
}

在这种情况下,popMax 将删除并返回两个部门中优先级最高的任务,从而确保首先处理最关键的工作。

有限容量 (Limited Capacity)

在由于有限的资源或特定要求而必须约束元素数量的情况下,您可以在插入时指定一个驱逐策略(evictMax 或 evictMin),以确保堆永远不会超过设定的容量。 这会自动根据元素的优先级管理要保留哪些元素,对于诸如维护固定大小的缓存或跟踪图搜索算法中最有希望的路径之类的任务特别有用。

var frontier = PriorityHeap<Path>(evictionPolicy: .evictMax, capacity: 10)

for path in newPaths {
    let result = frontier.attemptInsert(path, capacity: 10, evictionPolicy: .evictMax)
    if case .evict(let evictedPath) = result {
        print("Evicted less promising path: \(evictedPath.description)")
    }
}

安装 (Installation)

以下是如何在您的 Swift 包中包含 PriorityHeap:

.package(url: "https://github.com/JadenGeller/swift-priority-heap", version: "0.6")

然后,将其包含在您的目标依赖项中:

.target(name: "YourTarget", dependencies: ["PriorityHeap"]),

Swift Collections

PriorityHeap 由来自 swift-collections 包的 Heap 数据结构提供支持。 Swift Collections 是 Apple 的一个开源项目,向 Swift 引入了新的数据结构。 有关底层 Heap 数据结构的性能和特性的更多详细信息,您可以参考官方文档