You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中高效统计符合拼接规则的二元组长链可行组合数

Efficient Counting for Domino-like Chain Formation

你的暴力枚举方法虽然能得到正确结果,但随着链长度n增加,链的数量会指数级增长,空间和时间都会迅速失控——n=1000时完全无法运行。既然我们只需要统计可行链的总数,不需要枚举所有链,**动态规划(DP)**是最优解决方案,核心思路是跟踪每个步骤末端元素的链数量,而非保存完整链。

核心思路

我们用字典记录「到第i个链接时,以某个元素结尾的链的数量」:

  • 定义dp[i][x]:表示拼接完第i个链接(对应链长度为i+1)后,末端元素为x的可行链总数。
  • 初始化:第一个位置的所有链接,每个链接(a, b)都会给dp[0][b]加1(每个这样的链接都是一条长度为2的链)。
  • 迭代更新:对于后续每个位置,遍历前一步所有可能的末端元素prev_end,找到当前位置所有以prev_end为起始的链接(prev_end, curr_end),将dp[i-1][prev_end]的数量累加给dp[i][curr_end]。
  • 最终结果:将最后一步字典中的所有值求和,就是总可行链数量。

为了进一步优化空间,我们不需要保存所有历史dp数组,只用两个字典交替更新即可(前一步状态和当前状态)。

实现代码

from collections import defaultdict

def count_valid_chains(links):
    if not links:
        return 0  # 对应n=1的情况,没有链接,链数量为0
    
    # 初始化第一个位置的DP状态:记录每个末端元素的链数量
    prev_dp = defaultdict(int)
    for a, b in links[0]:
        prev_dp[b] += 1
    
    for current_links in links[1:]:
        curr_dp = defaultdict(int)
        # 预先把当前位置的链接按起始元素分组,优化查找效率
        link_groups = defaultdict(list)
        for a, b in current_links:
            link_groups[a].append(b)
        
        # 遍历前一步所有可能的末端元素,更新当前DP状态
        for prev_end, chain_count in prev_dp.items():
            # 找到所有以prev_end为起始的当前链接
            for curr_end in link_groups.get(prev_end, []):
                curr_dp[curr_end] += chain_count
        
        prev_dp = curr_dp
    
    # 所有末端元素的链数量之和就是总数量
    return sum(prev_dp.values())

测试验证

用你给出的例子测试:

links = [
    [ ('a', 1), ('a', 2), ('a', 3), ('b', 1), ],
    [ (1, 'A'), (2, 'A'), (2, 'B'), ],
    [ ('A', 'a'), ('B', 'a'), ('B', 'b'), ]
]
print(count_valid_chains(links))  # 输出:5,和示例中的可行链数量一致

效率对比

  • 暴力法:时间复杂度是指数级的,每次迭代都要处理所有已生成的链,n=1000时完全无法运行。
  • DP方法:时间复杂度为O(n*(L + C)),其中L是每个位置的平均链接数,C是每个位置的不同末端元素数(通常远小于L)。对于n=1000、每个位置数十个链接的场景,总操作数仅为几万次,速度比暴力法快几个数量级,轻松满足提升100倍的需求。
  • 空间复杂度:仅需维护两个字典,空间消耗为O(C),完全可以忽略不计。

内容的提问来源于stack exchange,提问作者maciek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 18:12:40