【问题标题】:Longest common substring across multiple sequences跨多个序列的最长公共子串
【发布时间】:2014-01-02 06:52:21
【问题描述】:

我正在尝试跨多个序列查找最长的公共子字符串 (LCS)。

CPAN 上有许多模块为 2 个序列实现 LCS 算法,例如 Algorithm::Diff String::LCSS_XS,但我很难将它们扩展到工作多于 2 个序列,因为跨多个序列的 LCS 不一定是任意两个序列之间的 LCS。

值得注意的是,尽管有它的名字,Algorith::MLCS 实际上并不返回 LCS,而是返回多个数组的所有公共元素(也是非连续的)。我的印象是它被设计破坏了,但我可能错了。

Algorithm::DiffAlgorith::MLCS解决的是最长公共子序列问题,而不是最长公共子串之一。

有没有明显的方法来扩展 n=2 算法,还是我必须实现我的版本?如果是,怎么做?

谢谢。

【问题讨论】:

  • 我不是专家,但我怀疑 Algorithm::MLCS 并非“被设计破坏”。相反,它正在解决一个不同的问题。它处理最长的常见子序列问题。如果我理解您的问题,那么您正在处理最长的常见 substring 问题。我认为 Algorithm::Diff 是一样的:它处理子序列问题。
  • 是的,你是对的,我没明白 substring 和 subsequence 之间有区别!

标签: algorithm perl lcs


【解决方案1】:

使用Tree::Suffix 模块可以很容易地解决这个问题。

例子:

#!/usr/bin/env perl
use Modern::Perl;
use Bio::SeqIO;
use Tree::Suffix;

my $seqio = Bio::SeqIO->new(
    -file => "fasta_sequences.txt",
    -format => "Fasta");

my @seqs;

while (my $seqobj = $seqio->next_seq) {
    push @seqs, $seqobj->seq;
}

my $tree = Tree::Suffix->new(@seqs);
my @lcss = $tree->lcs;

say $_ for @lcss;

【讨论】:

    猜你喜欢
    • 2011-08-10
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多