我想在Perl中实现此算法。 让我们接受的是:在Perl中使用较少的代码行实现此算法
- DNA1 = GACTAGGC
- DNA2 = AGCTAGGA
第一要素是G,我们会发现,如果没有为G在DNA2并将其指向带点。我们继续它直到结束,因此图像显示相同的元素交点为点。
下一步是:连接点。要指向点首先应该在一个小方格的左上角,另一个在右下方(我的意思是线条应该有135度)如果严格度是2,这意味着拒绝从2出现的线和少于2个点(这意味着如果严格度为3,则图像上只会有一条线)。
最后一步是:wordcount。如果wordcount是1(它是一个图像),这意味着比较元素一个接一个。如果是3,则表示将它们中的3个比较。您可以编写WORDCOUNT是1,因为它始终是1
我搜索关于它的程序,这是我所:
$infile1 = "DNA1.txt";
$infile2 = "DNA2.txt";
$outfile = "plot.txt";
$wordsize=0;
$stringency=0;
open inf, $infile1 or die "STOP! File $infile1 not found.\n";
$sequence1=<inf>;
chomp $sequence1;
@seq1=split //,$sequence1;
close inf;
open inf, $infile2 or die "STOP! File $infile2 not found.\n";
$sequence2=<inf>;
chomp $sequence2;
@seq2=split //,$sequence2;
close inf;
$Lseq1=$#seq1+1;
$Lseq2=$#seq2+1;
open ouf, ">$outfile";
for ($i=0;$i<$Lseq1;$i++){
print ouf "\n";
for ($j=0;$j<$Lseq2;$j++){
$match=0;
for ($w=0;$w<=$wordsize;$w++){
if($seq1[$i+$w] eq $seq2[$j+$w]){
$match++;
}
}
if($match > $stringency){
print ouf "1";
}
else{
print ouf "0";
}
}
}
您可以检查有关错误,我怎么可以优化我的代码Perl中的代码更少?
PS:我认为可以每次接受$ wordsize等于$严格。
编辑1:我编辑了我的代码,它适用于只是点。
编辑2:算法是这样的:
qseq, sseq = sequences
win = number of elements to compare for each point
Strig = number of matches required for a point
for each q in qseq:
for each s in sseq:
if CompareWindow(qseq[q:q+win], s[s:s+win], strig):
AddDot(q, s)
EDIT 3:这里是一个更好的算法建议:
osl.iu.edu/~chemuell/projects/bioinf/dotplot.ppt
任何想法,可根据该改进代码更好的算法是可喜的。
为什么更少的代码,这是很短了。实际上,如果我是你,我会添加一些代码,至少如果你将空格计为代码。 – 2011-03-29 20:38:56
我想优化它,如果我可以例如在文件操作或更改为任何其他循环循环,如果也有我不确定代码的作品。 – kamaci 2011-03-29 20:40:32
另外,这是我关于Perl问题的第三个主题,并且在所有这些问题上,评论就像sugestions非常短而且很好,但是在我看来,所有答案只是一行。所以这就是为什么我想越来越优化它,因为它是Perl,我想知道是否有可能做更多的事情。 – kamaci 2011-03-29 20:43:06