Bell Number in Java

2025年5月6日 | 阅读4分钟

在本节中,我们将学习什么是贝尔数,并创建Java 程序来检查给定的数字是否为贝尔数贝尔数程序经常在 Java 编码面试和学术中出现。

贝尔数

贝尔数是描述一个包含 N 个元素的集合可以被划分成多少个不相交的非空子集的一系列数字。

它用来表示一个包含 n 个元素的集合(非空)可以被划分成子集的数量。它也被称为指数数。换句话说,我们可以说贝尔数是集合的划分数。

它是 OEIS 序列A000110。前几个贝尔数是 1, 1, 2, 5, 15, 52, 203, 877, 4140 等。

贝尔数示例

考虑一个字母集 {a, b, c}。该集合包含三个元素。让我们找出给定集合的子集。

{{a}, {b}, {c}}; {{a}, {b, c}}; {{a, b}, {c}}; {{b}, {a ,c}}; {{a, b, c}}

我们观察到贝尔数给出了 (n, k) 的值,对于所有 k 值。其中 k 从 1 到 n,而集合 (n, k) 是 n 个元素划分成 k 个子集的数量。

数学上,我们可以写成如下

Bell Number in Java

求贝尔数的方法

有以下三种方法可以求贝尔数:

  • 使用 Dobinski 公式
  • 第二类斯特林数的和
  • 使用 Peirce 或贝尔三角形

使用 Dobinski 公式

我们可以使用以下 Dobinski 公式求第 n 个贝尔数

Bell Number in Java

算法

第二类斯特林数的和

计算 sum(n, k)。其中,k=1 到 n,以及所有数字的和。(n, k) 是第二类斯特林数。

Bell Number in Java

我们可以使用以下公式求斯特林数

Bell Number in Java

如果 n==k 或 k=1,则斯特林数将为 1。

算法

使用 Peirce 或贝尔三角形

使用贝尔三角形是求贝尔数的最佳方法。它是一个数字三角形,类似于帕斯卡三角形。它计算集合的划分,其中给定元素是最大的单例。它以其与贝尔数的紧密联系而得名,贝尔数出现在三角形的两侧,而贝尔数又以Eric Temple Bell 的名字命名。

以下三角形用于求贝尔数。

Bell Number in Java

让我们看看它是如何计算的。

  • 从数字 1 开始,并将其放在一行(x0,1 = 1)中。
  • 在新的一行中,写下上一行的最右边的元素。最右边的数字成为新行的最左边的元素。
  • 通过将左边的数字和左边数字的上方数字(即我们正在计算的数字的左上方对角线上的数字)相加来确定不在左列的数字。
  • 重复上述步骤,直到出现一个新行,该行的数字比前一行多一个。
  • 行左侧的数字是该行的贝尔数。

让我们在 Java 程序中实现上述逻辑。

贝尔数 Java 程序

BellNumberExample1.java

输出

Bell Number in Java

BellNumberExample2.java

输出

Bell Number in Java