
本文介绍一种基于“星与条”(stars and bars)思想的O(2ⁿ⁻¹)时间复杂度算法,避免递归回溯与重复排列,直接枚举整数n的所有有序加法划分(如1+2≠2+1),显著提升性能并消除冗余计算。
本文介绍一种基于“星与条”(stars and bars)思想的o(2ⁿ⁻¹)时间复杂度算法,避免递归回溯与重复排列,直接枚举整数n的所有**有序**加法划分(如1+2≠2+1),显著提升性能并消除冗余计算。
传统方法(如问题中sumways + perm组合)试图先生成所有无序划分,再对每个划分做全排列去重,不仅逻辑复杂、内存开销大(需存储大量中间列表和permslist),还因重复生成相同数字序列(如[1,1,1]被多次排列)导致严重冗余——这正是性能瓶颈根源。
更优解是跳过划分生成与排列分离的过程,直接构造所有有序划分。核心洞察在于:将整数 n 视为 n 个连续的 1(即 1+1+...+1),在 n-1 个相邻 1 的间隙中,每个位置可选择“切分”(插入 +)或“不切分”(合并)。这恰好对应一个 (n−1) 位二进制数:每一位为 1 表示在此处加 +,为 0 表示合并。
例如 n = 4,基础序列为 1 1 1 1,有 3 个间隙:1 □ 1 □ 1 □ 1
二进制 000 → 4001 → 1+3010 → 1+1+2011 → 1+1+1+1100 → 2+2101 → 2+1+1110 → 3+1111 → 1+1+1+1(同上,但实际按位顺序映射一致)
注意:该方法天然生成所有有序划分(compositions),而非无序划分(partitions),因此 1+2 和 2+1 被视为不同结果——这正是原问题中“6 个 1+1+1”的根源,而本方案通过设计规避了重复,每个划分仅生成一次。
以下是优化后的完整实现:
def print_all_compositions(n):
if n <p>输出:</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill3219" title="python全能编程助手"><img
src="https://img.php.cn/upload/skill/000/000/081/178952049933674.jpg" alt="python全能编程助手" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill3219" title="python全能编程助手" class="overflowclass">python全能编程助手</a>
<p class="overflowclass">SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、</p>
</div>
<a rel="nofollow" href="/xiazai/skill3219" title="python全能编程助手" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><pre class="brush:php;toolbar:false;">4
1+3
2+2
1+1+2
3+1
1+2+1
2+1+1
1+1+1+1✅ 优势总结:
- 零重复:每个划分由唯一二进制掩码生成,无需去重逻辑;
- 低开销:空间复杂度 O(n),仅存储当前划分;时间复杂度 O(n·2ⁿ⁻¹),远优于指数级回溯+全排列;
-
简洁可靠:无递归栈溢出风险,无全局变量污染(如原代码中的
permslist); -
可扩展:如需限制项数、最大值或筛选条件,可在
parts构建后直接过滤,无需修改核心逻辑。
⚠️ 注意事项:
- 此方法生成的是 compositions(有序划分),若业务场景严格要求 integer partitions(无序,如
1+2 == 2+1),则需额外排序去重(如tuple(sorted(parts))),但会损失效率;建议优先确认需求本质——多数实际应用(如密码学拆分、路径计数)恰恰需要有序性。 -
n ≥ 20时,2ⁿ⁻¹增长极快(超百万),应结合业务设置合理上限或改用生成器逐项处理,避免内存爆炸。
掌握这一“位运算驱动划分”的思维模式,不仅能解决整数划分问题,也为理解组合枚举、子集生成、格路计数等经典问题提供统一视角。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










