免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4729 | 回复: 16
打印 上一主题 下一主题

改进下程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-13 16:03 |只看该作者 |倒序浏览
要求:算出一个基因组序列(大约有3G)8联体的个数。
8联体是指8个由ACGT四个字母组成的序列对,共有4的8次方个(65536)。
目的:求出每个8联体出现的次数。
比如下面序列:从最开始1~8,2~9,3~10,4~11.....8个8个走,求出每个8联体出现的个数
gtatagaaatcatcgatttttcaggaaaagcaagaaagatcggtttaaaaaattatgaaattttattttaaaaatcgaaaaatcaacaaaaaaaatcgaaattttagaatttttctaaaatcggtagttttcgaaataaaataaaaatgttattttaaaaattattttaaaaaatttcgagaaattcaaaaatcgaacagaaatgttcgattttttgctacagtgcattttttttccacttctacgactttaaaggggggcgcatttatgcggaagggtcttgccgtgcacatagtcatcatttttaacaaagtctgctcaaaattcgcggagatcacgcgtagatcacaattaatttgtgaaaaagcaacagaaatacgaaatatgggataaatattttgtgatcttcatgtgatctacgcgaattttacacagaaactgctaaaaatgatgactaaatgcgcggcaagacccttccgcataaatgctcccccctttaaagtcgtagaagtaggaaaaaatgcactgtatggtgaatttgaaaattttctaaaaatccgaataatttagtatattggggtttcgacgaaaaatgccaatttttcagtaatttctggtcttttctaaaaaaatctacatatttcagatctcttcctccttttccgagttttttcgttattttttctaaactcacagtatattagcgaattttcaacaaattcgacaaaaaattctgactgttttctagaaaaaaaaaaaggcggcatgcgcaagtttcaaaatttgccgcacacctctgggcattaccttgaaagtatcaatggaaaagtgtcgcaagatttaattttctgatattccccccccccctcccgttttacttgtttctaggtttgagtttacttaaattaataacaaaactgggagatatatgctcgaaaattagacagaatctctgcctggacgatttctaggctacgccgtcattcccatagttttcataatctttcggctcagtgatcgaa
输出结果类似:
aaaaaaaa        9349.000000       
aaaaaaag        2045.000000       
aaaaaaac         2411.000000       
aaaaaaat         4831.000000       
aaaaaaga        1469.000000       
aaaaaagg        763.000000       
aaaaaagc        585.000000       
aaaaaagt         1714.000000       
aaaaaaca         1704.000000       
aaaaaacg        800.000000       
aaaaaacc         843.000000       
aaaaaact         1386.000000       
aaaaaata         2453.000000       
aaaaaatg         1972.000000       
aaaaaatc         2165.000000       
aaaaaatt         4936.000000       
aaaaagaa        1383.000000       
aaaaagag        653.000000       
aaaaagac        347.000000       

论坛徽章:
0
2 [报告]
发表于 2012-11-13 16:05 |只看该作者
这是我的C++程序,运行了一个星期了,还没运行完。
哪位大神帮我优化下程序。perl程序也可以,谢谢。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

#define N 65536

struct motif
{
  char name[20];
  float  number;
} lead[N];

void main()
{

        FILE *in,*out;
        in=fopen("result.txt","r");
        out=fopen("结果.txt","w");
    static char s[86000000];
        char c[4]={'a','g','c','t'};
        int i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,number=0;
        int person=0;
        float words=0;
        float expect=0;
       
        for(i=0;i<4;i++)
         for(j=0;j<4;j++)
          for(l=0;l<4;l++)
           for(m=0;m<4;m++)
            for(n=0;n<4;n++)
             for(p=0;p<4;p++)
              for(q=0;q<4;q++)
               for(r=0;r<4;r++)
                   {
                lead[number].name[0]=c[i];
                lead[number].name[1]=c[j];
                lead[number].name[2]=c[l];
                lead[number].name[3]=c[m];
                lead[number].name[4]=c[n];
                lead[number].name[5]=c[p];
                lead[number].name[6]=c[q];
                lead[number].name[7]=c[r];
                number++;
                   }

    while(!feof(in))
        {
      fgets(s,86000000,in);
          if(s[0]=='@') break;
          for(i=0;i<85999999;i++)
          {
           for(j=0;j<4;j++)
                for(k=0;k<4;k++)
                 for(l=0;l<4;l++)
                  for(m=0;m<4;m++)
                   for(n=0;n<4;n++)
                    for(p=0;p<4;p++)
                     for(q=0;q<4;q++)
                      for(r=0;r<4;r++)
                          {
                       if(s[i]==c[j]&&s[i+1]==c[k]&&s[i+2]==c[l]&&s[i+3]==c[m]&&s[i+4]==c[n]&&s[i+5]==c[p]&&s[i+6]==c[q]&&s[i+7]==c[r])
                                  lead[person].number++;
               person++;
                          }  
       person=0;
       words++;
          }
           
          for(i=0;i<85999999;i++)
                s[i]=' ';
           }

    fprintf(out,"The Number of total words are %f\n",words);

    expect=words/N;

    fprintf(out,"The Expect Number words are %f\n",expect);


        for(k=0;k<N;k++)               
                fprintf(out,"%s\t%f\t%f\n",lead[k].name,lead[k].number,lead[k].number/65536.0);
       
        fclose(out);
}

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
3 [报告]
发表于 2012-11-13 17:53 |只看该作者
  1. #!perl6
  2. my %h;
  3. my $s = 'gtatagaaatcatcgatttttcaggaaaagcaagaaagatcggtttaaaaaattatgaaattttattttaaaaatcgaaaaatcaacaaaaaaaatcgaaattttagaatttttctaaaatcggtagttttcgaaataaaataaaaatgttattttaaaaattattttaaaaaatttcgagaaattcaaaaatcgaacagaaatgttcgattttttgctacagtgcattttttttccacttctacgactttaaaggggggcgcatttatgcggaagggtcttgccgtgcacatagtcatcatttttaacaaagtctgctcaaaattcgcggagatcacgcgtagatcacaattaatttgtgaaaaagcaacagaaatacgaaatatgggataaatattttgtgatcttcatgtgatctacgcgaattttacacagaaactgctaaaaatgatgactaaatgcgcggcaagacccttccgcataaatgctcccccctttaaagtcgtagaagtaggaaaaaatgcactgtatggtgaatttgaaaattttctaaaaatccgaataatttagtatattggggtttcgacgaaaaatgccaatttttcagaaaaaaaaaaaatccttttccgagttttttcgttattttttctaaactcacagtatattagcgaattttcaacaaattcgacaaaaaattctgactgttttctagaaaaaaaaaaaggcggcatgcgcaagtttcaaaatttcccccccccccccttaaattaataacaaaactgggagatatatcttt';
  4. $s ~~ m:ov/(.**8){%h{$0}++}/;
  5. .say for %h.sort;
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-11-13 18:24 |只看该作者
看不懂,要在wondos下运行。
$s ~~ mv什么意思?
运行出错,是不要安装某个模块呀?
谢谢
回复 3# rubyish


  

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
5 [报告]
发表于 2012-11-13 20:20 |只看该作者
  1. perl -le '$str="gtatagaaatcatcgatttttcaggaaaagcaagaaagatcggtttaaaaaattatgaaattttattttaaaaatcgaaaaatcaacaaaaaaaatcgaaattttagaatttttctaaaatcggtagttttcgaaataaaataaaaatgttattttaaaaattattttaaaaaatttcgagaaattcaaaaatcgaacagaaatgttcgattttttgctacagtgcattttttttccacttctacgactttaaaggggggcgcatttatgcggaagggtcttgccgtgcacatagtcatcatttttaacaaagtctgctcaaaattcgcggagatcacgcgtagatcacaattaatttgtgaaaaagcaacagaaatacgaaatatgggataaatattttgtgatcttcatgtgatctacgcgaattttacacagaaactgctaaaaatgatgactaaatgcgcggcaagacccttccgcataaatgctcccccctttaaagtcgtagaagtaggaaaaaatgcactgtatggtgaatttgaaaattttctaaaaatccgaataatttagtatattggggtttcgacgaaaaatgccaatttttcagtaatttctggtcttttctaaaaaaatctacatatttcagatctcttcctccttttccgagttttttcgttattttttctaaactcacagtatattagcgaattttcaacaaattcgacaaaaaattctgactgttttctagaaaaaaaaaaaggcggcatgcgcaagtttcaaaatttgccgcacacctctgggcattaccttgaaagtatcaatggaaaagtgtcgcaagatttaattttctgatattccccccccccctcccgttttacttgtttctaggtttgagtttacttaaattaataacaaaactgggagatatatgctcgaaaattagacagaatctctgcctggacgatttctaggctacgccgtcattcccatagttttcataatctttcggctcagtgatcgaa"; while($str=~m{.{8}}g){$hash{$&}++;pos($str)-=7};use Data::Dumper;print Dumper \%hash'
复制代码

论坛徽章:
0
6 [报告]
发表于 2012-11-13 21:13 |只看该作者
谢谢你,运行速度很快,就是结果的形式我怎么改也分不开?
#!usr/bin/perl -w
#use strict;
use Data:umper;
open IN,"data.txt";
open OUT,">result.txt";
$str=<IN>;
while($str=~m{.{8}}g){


$hash{$&}++;
pos($str)-=7
}
print  OUT Dumper \%hash

结果形式
$VAR1 = {
          'cacacctc' => 1,
          'cggagatc' => 1,
          'cggctcag' => 1,
          'gcaagatt' => 1,
          'gtgatctt' => 1,
          'ctggacga' => 1,
          'atttaatt' => 1,
          'cgtagatc' => 1,
          'cttttccg' => 1,
          'ggctacgc' => 1,
          'aggggggc' => 1,
          'tattttaa' => 3,
          'aatgctcc' => 1,
          'tctaaaat' => 1,
          'caacagaa' => 1,
          'acaaaaaa' => 2,
          'agaaatac' => 1,
          'ccgaataa' => 1
        };
最好是:
       cacacctc     1
          cggagatc   1
          cggctcag   1
          gcaagatt   1
          gtgatctt    1
          ctggacga   1
          atttaatt     1
          cgtagatc    1
          cttttccg     1
          ggctacgc   1
         aggggggc   1
          tattttaa     3
          aatgctcc    1
         
回复 5# yinyuemi


   

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
7 [报告]
发表于 2012-11-13 21:29 |只看该作者
回复 6# zhagnqiang829


    map{print $_,"\t",$hash{$_},"\n"}keys %hash

论坛徽章:
0
8 [报告]
发表于 2012-11-13 21:57 |只看该作者
OK
多谢。。回复 7# yinyuemi


   

论坛徽章:
0
9 [报告]
发表于 2012-11-14 00:27 |只看该作者
学习,感谢回复 5# yinyuemi


   

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
10 [报告]
发表于 2012-11-14 09:06 |只看该作者
优化下:
  1. #!/usr/bin/perl

  2. use 5.016;
  3. use threads;

  4. open my $d, 'datafile';
  5. my $s = <$d>;
  6. chomp $s;
  7. my ( $p, $ta, $x, $in, @th ) = ( 20, '', 0 );
  8. my $i = int( length($s) / $p ) + 1;

  9. for ( 1 .. $p ) {
  10.     my $sp = substr( $s, $x, $i );
  11.     $x += $i;
  12.     $in = $ta . $sp;
  13.     push @th, threads->create( \&that );
  14.     $ta = substr( $sp, -7, 7 );
  15. }

  16. my ( @r, %k );
  17. push @r, $_->join for @th;

  18. for (@r) {
  19.     my %h = %$_;
  20.     $k{$_} += $h{$_} for keys %h;
  21. }

  22. say "$_\t$k{$_}" for sort keys %k;

  23. sub that {
  24.     my %h;
  25.     for ( 0 .. length($in) - 8 ) {
  26.         $h{ substr( $in, $_, 8 ) }++;
  27.     }
  28.     return \%h;
  29. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP