【问题标题】:Is there any algorithm to address the longest common subsequence problem with different weights for each character?是否有任何算法可以解决每个字符具有不同权重的最长公共子序列问题?
【发布时间】:2019-05-13 23:00:45
【问题描述】:

我正在寻找一种算法来解决具有以下条件的两个字符串的 LCS 问题:

每个字符串由英文字符组成,每个字符都有一个权重。例如:

序列 1 (S1):“ABBCD”,权重为 [1, 2, 4, 1, 3]

序列 2 (S2):“TBDC”,权重为 [7, 5, 1, 2]

假设MW(s, S)被定义为字符串S中的子序列s相对于相关权重的最大权重。最重的公共子序列(HCS)定义为:

HCS = argmin(MW(s, S1), MW(s, S2))

算法输出应该是字符串和权重中HCS的索引。在这种情况下,索引将是:

I_S1 = [2, 4] --> MW("BD", "ABBCD") = 7

I_S2 = [1, 2] --> MW("BD", "TBDC") = 6

因此HCS = "BD", and weight = min(MW(s, S1), MW(s, S2)) = 6.

【问题讨论】:

  • 你为完成任务做了什么?
  • 如果权重是非负的,您可以使用与普通 LCS 相同的方法;但是,在递归公式中,您应该使用权重的总和来最小化而不是字符数。不过,我不确定负权重的情况。
  • 是的,权重是非负的。你知道我可以使用哪种 LCS 算法来修改和解决我自己的问题吗?

标签: algorithm dynamic-programming lcs


【解决方案1】:

你需要建立的表会有这个。

for each position in sequence 1
    for each position in sequence 2
        for each extreme pair of (weight1, weight2)
            (last_position1, last_position2)

极端对是指无法找到该点的子序列,其序列 1 中的权重和序列 2 中的权重均 >= 且至少有一个 >。

可能有多个极值对,其中一个序列高于另一个序列。

规则是在(i, -1)(-1, j) 位置,唯一的极端对是权重为0 的空集。在任何其他位置,我们合并(i-1, j)(i, j-1) 的极端对。然后如果seq1[i] = seq2[j],则添加您转到(i-1, j-1) 的选项,然后在各自的子序列中包含ij。 (所以将weight1[i]weight2[j] 添加到权重中,然后进行合并。)

对于该合并,您可以按 weight1 升序对前两个点的所有极值进行排序,然后丢弃所有 weight2 小于或等于已在序列中较早发布的最佳 weight2 的所有极值。

当你到达终点时,你会找到最小值最高的极端对,这就是你的答案。然后,您可以返回数据结构以找到有问题的子序列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2023-04-03
    • 2011-06-30
    • 1970-01-01
    相关资源
    最近更新 更多