【发布时间】:2012-01-17 09:20:43
【问题描述】:
我有以下关于序列比对的问题:
我们知道,当您想强制两个序列在整个长度上对齐时,全局对齐算法很有用,局部对齐可以找到相似度最高的一个或多个区域在两个序列之间并从那里向外建立对齐。
当我们有一个非常长的序列和一个小序列库时,在库中找到小序列连接的最佳算法是什么,以最小化比对成本?
【问题讨论】:
标签: string algorithm data-structures sequence-alignment
我有以下关于序列比对的问题:
我们知道,当您想强制两个序列在整个长度上对齐时,全局对齐算法很有用,局部对齐可以找到相似度最高的一个或多个区域在两个序列之间并从那里向外建立对齐。
当我们有一个非常长的序列和一个小序列库时,在库中找到小序列连接的最佳算法是什么,以最小化比对成本?
【问题讨论】:
标签: string algorithm data-structures sequence-alignment
令 ∑ 为字母表(例如,{A, C, G, T})。令 L ⊆ ∑* 为短文库序列的集合。计算 L* 的最小状态 DFA (Q, ∑, ∂, q0, F)。
我们一次扫描一个字母的长序列 x ∈ ∑*。令 x' 为已被消费的 x 的前缀。对于每个状态 q ∈ Q,我们维持 [每个序列 y ∈ ∑* 上的最小 cq(x') 使得 ∂(q0, y) = q] x' 和 y 之间的 Levenshtein 距离。
对于空前缀ε,对于每个状态q ∈ Q,它认为cq(ε) = min {|y|: y ∈ ∑*, ∂(q0 , y) = q},因为 y 和 ε 之间的距离就是 y 的长度。在转换图上使用广度优先搜索计算初始表。
给定 x' 和一个字母 s 的表格,我们计算 cq(x) 作为 y 的几种可能性的最小值,其中 x = x' s。
字符串 y = y's z,对齐 s。这种情况下的代价是 minq', z: ∂(q', sz) = q (cq'(x') + |z|),即可以通过 |Q| 计算广度优先搜索。
字符串 y = y',删除 x 中的 s。在这种情况下,成本是 cq(x') + 1。
字符串 y = y' t 其中 t 是一个字母,用 s 代替 t(反之亦然)。这种情况下的代价是 minq', t: ∂(q', t) = q (cq'(x') + 1)。
最后,最优对齐成本为 minq ∈ F cq(x)。可以按照动态程序的通常方式重建对齐方式。
【讨论】:
一种天真的方法是尝试所有排列。如果S 是库中每个小序列的排列集,您可以将大序列与S 中的每个序列一一比对,看看哪个比对成本最低。不幸的是,这对 CPU 不友好,因为S 的大小在小序列的数量上呈指数增长。
【讨论】: