在算法和组合数学中,卡特兰数(Catalan Number)是一类非常重要的数列。它广泛应用于括号匹配、二叉树结构计数、栈操作序列等问题中。本教程将从零开始,用Java语言带你一步步理解并实现卡特兰数,即使是编程小白也能轻松掌握!
卡特兰数是一个整数序列,其前几项为:
1, 1, 2, 5, 14, 42, 132, ...
第 n 项卡特兰数(通常记作 Cₙ)可以用于解决以下经典问题:
卡特兰数有多种计算方式,最常见的是以下两种:
1. 递推公式:
C₀ = 1
Cₙ = Σ (Cᵢ × Cₙ₋₁₋ᵢ),其中 i 从 0 到 n−1
2. 闭式公式(组合数形式):
Cₙ = (1 / (n + 1)) × C(2n, n) = (2n)! / ((n + 1)! × n!)
下面我们用 Java 分别通过递归、动态规划和组合公式三种方式来计算卡特兰数。
public class CatalanNumber { // 递归计算第 n 个卡特兰数 public static long catalanRecursive(int n) { if (n <= 1) { return 1; } long res = 0; for (int i = 0; i < n; i++) { res += catalanRecursive(i) * catalanRecursive(n - 1 - i); } return res; } public static void main(String[] args) { for (int i = 0; i < 6; i++) { System.out.println("C(" + i + ") = " + catalanRecursive(i)); } }} ⚠️ 注意:递归方法时间复杂度为 O(4ⁿ / n^(3/2)),仅适用于小规模 n(如 n ≤ 10)。
public class CatalanDP { public static long catalanDP(int n) { long[] dp = new long[n + 1]; dp[0] = dp[1] = 1; for (int i = 2; i <= n; i++) { dp[i] = 0; for (int j = 0; j < i; j++) { dp[i] += dp[j] * dp[i - 1 - j]; } } return dp[n]; } public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println("C(" + i + ") = " + catalanDP(i)); } }} ✅ 动态规划的时间复杂度为 O(n²),空间复杂度为 O(n),适合计算中等规模的卡特兰数。
public class CatalanFormula { // 计算组合数 C(n, k) public static long binomialCoeff(int n, int k) { long res = 1; if (k > n - k) { k = n - k; // 利用对称性优化 } for (int i = 0; i < k; i++) { res *= (n - i); res /= (i + 1); } return res; } // 使用闭式公式计算卡特兰数 public static long catalanFormula(int n) { long c = binomialCoeff(2 * n, n); return c / (n + 1); } public static void main(String[] args) { for (int i = 0; i < 15; i++) { System.out.println("C(" + i + ") = " + catalanFormula(i)); } }} 🔥 此方法时间复杂度仅为 O(n),是计算大数值卡特兰数的最佳选择。
在实际开发中,卡特兰数算法常用于以下场景:
通过本教程,你已经掌握了:卡特兰数的定义、数学原理、三种 Java 实现方式以及典型应用场景。无论是面试准备还是算法学习,理解Java实现卡特兰数都是一个非常有价值的技能。
建议动手运行上述代码,并尝试修改参数观察结果。只有实践才能真正掌握卡特兰数应用的精髓!
关键词回顾:卡特兰数、Java实现卡特兰数、卡特兰数算法、卡特兰数应用
本文由主机测评网于2025-12-12发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025126494.html