求解双有序列表保序加权最大得分配对的算法需求
固定顺序列表最大得分配对的适配算法
适配的核心算法
你提出的配对约束完全对应「带可选空位的两序列最大权全局对齐」场景,最适合的实现方案是调整空位规则后的Needleman-Wunsch动态规划算法。
核心实现逻辑
原始Needleman-Wunsch算法是生物序列比对的经典动态规划方法,针对当前需求修改简单规则即可完全适配:
- 定义DP状态:
dp[i][j]表示仅考虑列表A的前i个元素、列表B的前j个元素时,可获得的最大配对总得分 - 状态边界初始化:
- 当
i=0或j=0时,也就是仅考虑其中一个列表的元素、另一个列表为空时,最大得分恒为0——不存在可参与配对的有效元素
- 当
- 状态转移规则(计算
dp[i][j]时取三个分支的最大值):- 分支1:A的第
i个元素不参与配对,对应得分等于仅考虑A的前i-1个元素、B的前j个元素的最大得分,即dp[i-1][j] - 分支2:B的第
j个元素不参与配对,对应得分等于仅考虑A的前i个元素、B的前j-1个元素的最大得分,即dp[i][j-1] - 分支3:A的第
i个元素和B的第j个元素配对,对应得分等于仅考虑A的前i-1个、B的前j-1个元素的最大得分,加上两个元素的匹配得分,即dp[i-1][j-1] + score(A[i], B[j])
- 分支1:A的第
- 结果回溯:计算完所有DP状态后,从
dp[len(A)][len(B)]的位置反向追溯每个状态的转移来源,即可得到所有满足顺序约束的配对集合
示例校验
针对题目给出的测试用例:
- A =
{a, b, c, d},B ={e, f, g},搭配给定的两两匹配得分表 - 按上述规则计算得到的最大总得分为30,回溯得到的配对集合为
[{a,e}, {d,f}],和题目给出的最优结果完全匹配
复杂度说明
- 时间复杂度:与两个列表的长度乘积正相关,即
O(len(A) * len(B)),对绝大多数常规业务规模的列表计算效率足够 - 空间复杂度:可通过滚动数组优化,将空间占用降低到
O(min(len(A), len(B))),不需要保存全量DP矩阵
内容的提问来源于stack exchange,提问作者crsdahl
相关产品推荐
相关产品推荐

