C 排列组合算法里面的 C 代表组合,英文是 Combination,核心特点是只挑选元素不考虑顺序,也就是从 n 个不同元素里面选出 k 个元素,组成一组,不关心这 k 个元素内部的先后排列顺序,记号写作 C (n,k),也常写成Cnk,计算公式是 C (n,k)=n 的阶乘除以 k 的阶乘再乘以 n 减 k 的阶乘,这个算法是概率论 高中数学 编程刷题里面非常基础也高频的算法,很多初学者容易把组合 C 和排列 A 弄混,排列是要区分顺序,组合不需要区分顺序,这是整套算法最核心的区别,掌握这个公式之后,还可以延伸出递推算法 动态规划杨辉三角算法 大数防溢出算法,适配不同的计算场景。
一 基础公式定义
组合数公式
C (n,k) = n! / ( k! × (n−k)! )
补充边界规则
当 k>n 的时候,C (n,k)=0,也就是选的数量超过总元素,不存在这种组合
当 k=0 或者 k=n 的时候,C (n,k)=1,全部不选或者全部选出,都只有 1 种方案
当 k 大于 n 的一半的时候,可以利用性质 C (n,k)=C (n,n−k),减少计算量
核心性质清单
1 对称性 C (n,k)=C (n,n−k)
2 递推性质 C (n,k)=C (n−1,k−1)+C (n−1,k),这个就是杨辉三角的底层公式
3 C (n,0)=1 C (n,n)=1
二 三种主流 C 排列组合算法实现思路
第一种 阶乘直接计算法
原理就是直接按照原始公式,先算出 n 的阶乘 k 的阶乘 n 减 k 的阶乘,再做除法得到结果。
优点 代码简单直观,适合理解公式
缺点 阶乘增长极快,数字稍微变大就会溢出整型,不适合大 n 的场景
第二种 递推动态规划杨辉三角算法
原理使用递推公式 C (n,k)=C (n−1,k−1)+C (n−1,k),逐行填表,构建杨辉三角二维表。
优点 全程只用加法,不需要阶乘除法,不容易出现除法精度问题
缺点 需要提前开辟二维数组,内存占用更高,适合需要批量查询多个组合数的场景
第三种 连乘优化算法
原理 对公式变形,C (n,k)= [ n × (n−1) × (n−2) … ×(n−k+1) ] /k!
计算的时候边乘边除,每一步都保证可以整除,不用等到最后再做除法,规避大数阶乘溢出问题,是工程里最常用的优化版本。
三 计算示例
举例 C (5,2)
代入公式 5! / (2! × 3!) = 120 / (2 × 6) = 10
含义就是从 5 个元素里面选 2 个,不考虑顺序,总共有 10 种组合方案
| 算法名称 | 核心运算 | 适用场景 | 主要缺陷 |
|---|---|---|---|
| 阶乘直接法 | 阶乘乘除 | 小数值入门学习 | 大数容易溢出 |
| 杨辉三角递推 | 加法递推 | 批量查询组合数 | 占用二维内存 |
| 连乘优化法 | 边乘边除 | 工程计算大数值 | 需要保证整除逻辑 |
四 算法选型步骤
第一步 先确认需求,是单次计算组合数,还是需要多次查询大量组合数
第二步 判断 n 的大小,如果 n 很小,直接使用阶乘公式就可以
第三步 如果 n 比较大,优先选择连乘优化算法,如果是频繁查询,选择杨辉三角动态规划预计算
第四步 确认边界条件,k 大于 n 返回 0,k 等于 0 或者等于 n 返回 1,避免计算错误
综合来看,C 排列组合算法本质就是计算无顺序选取方案总数,基础是阶乘公式,工程应用会根据数值大小和查询频率,选择阶乘法 杨辉三角递推法或者连乘优化法,同时牢记组合和排列的核心差别就是是否考虑元素顺序。
【常见问题】
问题 1 C 排列组合算法里面 C 和 A 排列有什么区别
回答 1 C 排列组合算法中的 C 是组合,不考虑元素顺序,A 是排列,需要区分选中元素的先后顺序,同样 n 选 k,排列 A (n,k) 数值会比组合 C (n,k) 更大。
问题 2 C 排列组合算法为什么会出现数值溢出
回答 1 C 排列组合算法如果使用阶乘直接计算,阶乘增长速度非常快,n 变大之后阶乘数值超过整数类型上限,就会发生溢出,所以大数值场景推荐连乘优化算法。
问题 3 C 排列组合算法的递推公式是什么
回答 1 C 排列组合算法递推公式是 C (n,k)=C (n−1,k−1)+C (n−1,k),这个递推式也是杨辉三角的核心,适合动态规划批量计算组合数。
问题 4 C 排列组合算法什么时候结果等于 1
回答 1 C 排列组合算法当中,当 k 等于 0 或者 k 等于 n 的时候,C (n,k)=1,也就是一个元素都不选,或者全部元素都选中,都只有唯一一种方案。
【免责申明】
本文为 C 排列组合算法的原理与实现讲解,不同编程语言的数据类型 大数库实现存在差异,实际编码时请根据业务需求调整溢出处理逻辑,内容仅用于学习参考,不保证适配所有极端测试场景。


