Swift Algorithms 发布公告
我很高兴地宣布 Swift Algorithms,这是一个新的开源软件包,包含序列和集合算法以及它们相关的类型。
算法是强大的思维工具,因为它们封装了难以阅读且容易出错的原始循环。Algorithms
包包含许多在其他流行的编程语言中常见的强大通用算法。我们希望这个新软件包能够帮助人们拥抱算法,从而提高代码的正确性和性能。
简要概览
通过 Algorithms
包的初始序列和集合操作集,您可以遍历集合的元素,查找组合和排列,创建随机样本等等。
其中包含一对 chunked
方法,每种方法都将集合分解为连续的子序列。其中一个版本测试相邻元素以查找块之间的断点 — 您可以使用它来快速将数组分成升序运行的序列
let numbers = [10, 20, 30, 10, 40, 40, 10, 20]
let chunks = numbers.chunked(by: { $0 <= $1 })
// [[10, 20, 30], [10, 40, 40], [10, 20]]
另一个版本查找每个后续值的转换中的变化。您可以使用它来按首字母将名称列表分成组
let names = ["Cassie", "Chloe", "Jasmine", "Jordan", "Taylor"]
let chunks = names.chunked(on: \.first)
// [["Cassie", "Chloe"], ["Jasmine", "Jordan"], ["Taylor"]]
您可以在包含的指南中阅读有关 chunked
或 Algorithms
包中任何其他组件的更多信息
- Combinations
- Permutations
- Product
- Chunked
- Chain
- Cycle
- Unique
- Random Sampling
- Indexed
- Partition
- Rotate
与 Swift 标准库的关系
我们的目标是让标准库包含一组丰富且实用的通用算法。我们认为 Algorithms
包可以通过作为一个低摩擦的场所来构建新的相关算法系列来帮助实现这一目标——这让我们有机会迭代地探索问题空间,并了解不同算法如何连接和交互——然后再将它们升级到标准库。
像 Swift Algorithms (和 Swift Numerics) 这样的软件包通过提供以下方式来补充 Swift Evolution 流程:
- 更早地让社区参与到开发过程中
- 引导贡献流向活跃的焦点领域
- 征求基于实际使用情况的反馈
- 连贯地解决大量缺失的功能
Algorithms
包在某种程度上是对漫长的 SE-0270 审查和后续 Evolution 流程讨论的回应。在 SE-0270 中,我们面临着一个矛盾,即提案要足够小,以便有效地利用 Swift 讨论论坛,但又要足够大,以激励和确保添加内容的一致性。展望未来,我们计划尝试将相关算法系列分解为多个较小的 Evolution 提案,并利用 Algorithms
包的存在来提供额外的背景信息。
但是,仅仅因为一个新增功能可能是包含在 Algorithms
包中的一个好的候选,并不意味着它必须从那里开始它的生命周期。这 不是 对 Swift Evolution 流程的更改。一如既往,我们将继续考虑获得良好支持的提案。
贡献标准
该软件包当前的重点是孵化一组实用的算法,这些算法在 Sequence
和 Collection
协议族上进行了泛化,最终包含在 Swift 标准库中——您可能会在 Python itertools 模块或 C++ algorithms 库中找到的那种功能。
有许多有趣且有用的抽象不符合此标准。例如
- 货币类型(例如
Result
)和数据结构(例如OrderedDictionary
) - 不适用于
Sequence
或Collection
的一次性便利功能(例如Dictionary.subscript(key:default:)
) - 具有更实用替代方案的经典算法(例如 quicksort、merge sort、heapsort、insertion sort 等)
- 非线性数据结构上的算法
对于添加到 Algorithms
包的任何内容,都应努力收集用例并检查该主题在其他语言和其他平台上是如何探索的。为了评估其适用性,我们应该问
- 它有助于提高可读性吗?
- 这是一个常见的操作吗?
- 它与现有的抽象概念一致吗?
- 它有助于避免正确性陷阱吗?
- 它有助于避免性能陷阱吗?
… 或者反过来说
- 它是否易于组合?(例如
!isEmpty
) - 它可能会鼓励误用吗?
参与进来!
我们非常欢迎您的经验、反馈和贡献!
- 通过在 GitHub 上试用 Swift Algorithms 库开始,
- 在 Swift Algorithms 论坛中讨论该库并获得帮助,
- 如果您发现问题或有改进的想法,请打开一个 issue,
- 如上所述,欢迎提交 pull request 来修复错误或添加符合软件包标准的新算法!