Benchmarking of algorithms for set partitions
本文回顾了用于枚举集合划分的算法,提供了其计数的近似公式,并根据基准测试推荐了 Djokic 等人的算法。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象一下你有一盒各不相同的乐高积木。你的任务是找出将这些积木进行分组的所有可能方式。你可以把每块积木都放在自己的小堆里,也可以把它们全部堆成一座巨大的高塔,或者将它们混合搭配成各种不同的簇。在数学世界中,这被称为集合划分(set partition)。
这篇论文本质上是一份关于尝试列出所有这些可能分组的计算机程序的“比赛报告”。以下是作者的研究发现,使用了简单的类比:
1. 问题所在:快速爆炸的谜题
作者解释说,虽然列出少量物品的分组听起来很简单,但可能性的数量会爆炸式增长。
- 类比: 这就像是一个抢座位的游戏,只不过参与者不是人,而是数字。如果有 3 个项目,有 5 种分组方式。但当达到 17 个项目时,会有大约 820 亿种不同的分组方式。
- 现实情况: 如果你有超过 17 或 18 个项目,让计算机在合理的时间内列出每一个分组是不可能的。然而,对于较小的数字,让计算机完成这项工作是非常有用的,特别是在处理像装箱或排班表这类优化任务时。
2. 计算可能性(“贝尔数”)
在开始对算法进行竞赛之前,作者需要一种方法来准确知道可以预期多少个分组。这些数字被称为贝尔数(Bell Numbers)。
- 挑战: 计算精确的数量非常困难,因此数学家使用公式来进行估算。
- 发现: 作者测试了几种复杂的数学公式。他们发现一种特定的公式(涉及一个被称为“兰伯特 W 函数”的特殊数学函数)极其精确。这就像拥有一个即使对于小规模项目也能精确到分钟的天气预报。他们还发现了一种更简单的公式,它在处理较小组别时表现良好,但随着数字变得巨大,它会变得有些不准确。
3. 比赛:四种算法的竞争
论文的核心部分是一个“基准测试(benchmark)”,这只是一个时髦的说法,指的就是一场计时赛。作者将四种旨在列出这些分组的不同计算机程序(算法)放在各种计算机(笔记本电脑、台式机、云服务器)上运行,并使用了不同的软件工具(编译器)和操作系统(Windows 和 Linux)。
这四位参赛者分别是:
- Hutchinson 算法: “老前辈”。这是几十年前的经典方法。
- Semba 算法: 一位现代且快速的竞争者。
- Er 算法: 另一位现代且快速的竞争者。
- Djokic 等人的算法: 最新的挑战者。
结果:
- 老前辈 (Hutchinson): 这个程序的运行速度明显慢于其他程序。它就像穿着沉重的靴子跑马拉松。作者明确表示:不要使用这个。
- 现代选手 (Semba, Er, Djokic): 它们要快得多。
- 冠军: Djokic 的算法摘得了金牌。它是表现最出色的,也是最快的。
4. “引擎”同样重要
作者还发现,运行代码的“引擎”与汽车本身一样重要。
- 操作系统: 在 Linux 上运行的代码通常比在 Windows 上更快。
- 编译器: 将代码翻译成机器语言的工具也会产生巨大的差异。例如,在一种特定的算法上,Intel 编译器比标准的 GNU 编译器快得多;但在另一种算法上,GNU 编译器反而更快。
- 启示: 要获得最佳速度,你需要正确的算法以及正确的软件设置。
5. 最终建议
在进行了数千次测试后,作者为任何需要进行此类工作的人给出了明确的结论:
- 使用 Djokic 等人的算法。 它是最快的,而且相对较短(易于编写),并且易于实现。
- 提示: 请确保你的计算机设置为“高性能”模式(编译器优化级别 2 或更高),如果你使用的是 Linux,请使用 Intel 编译器以获得最佳效果。
他们未涵盖的内容
作者谨慎地坚持在基础范围内进行讨论。他们没有测试那些试图寻找带有特定限制的分组(例如“每组最多只能有 3 个项目”)的算法,也没有研究一种称为“格雷码(Gray codes)”的不同类型的排序系统。这些内容留作未来的研究。
总结: 如果你需要计算机列出一组小型项目的每一种分组方式,不要使用旧方法。使用 Djokic 算法,在 Linux 上运行并配合 Intel 编译器,你就能在眨眼之间完成任务。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。