标题:求优化下程序,这个程序能用,就是运行太慢,求优化下能加快速度
只看楼主
a13780393
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2012-10-6
结帖率:25%
 问题点数:0 回复次数:36 
求优化下程序,这个程序能用,就是运行太慢,求优化下能加快速度
#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()
{

/////计算TATA 保守性
   
    FILE *in,*out;
    in=fopen("result1.txt","r");
    out=fopen("结果.txt","w");
    static char s[1687200000];
    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,1687200000,in);
      if(s[0]=='@') break;
      for(i=0;i<1687199999;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<1687199999;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);
}
这个程序的意思是统计由acgt这四个字母组合成的8长度的字符串,在另一个文件中出现的频数。由这四种字母组成字符串长度为8的方式一共有4的8次方个(65536)。比如:aaaaaaaa、aaaaaaag、aaaaaaac等等 以此类推。另一个文件中也全是由这四种字母组成的,共有16亿长度。我就是想统计这65536个字符串中,在文件2中,每个字符串各出现了多少 次,并依次输出。

[ 本帖最后由 a13780393 于 2012-11-9 18:27 编辑 ]
搜索更多相关主题的帖子: 优化 include person expect 
2012-11-09 12:41
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
连蒙带猜才搞懂你想干什么鸟事

以下代码通过了 gcc4.7.0 -std=c99 的编译
程序代码:
#include <stdio.h>
#include <string.h>
#include <assert.h>

unsigned long dna8_str2val( const char str[8] )
{
    unsigned long val = 0;
    for( size_t i=0; i<8; ++i )
    {
        val <<= 2;
        switch( str[i] )
        {
        case 'a': val|=0; break;
        case 'g': val|=1; break;
        case 'c': val|=2; break;
        case 't': val|=3; break;
        default: return -1ul;
        }
    }
    return val;
}

void dna8_val2str( unsigned long val, char str[8] )
{
    assert( val < (1ul<<(8*2)) );

    for( size_t i=0; i<8; ++i )
    {
        str[7-i] = "agct"[val%4];
        val >>= 2;
    }
}

int main()
{
    unsigned long words = 0;
    unsigned long numbers[65536] = { 0 };

    // 处理
    FILE* fin = fopen( "result1.txt", "r" );
    if( !fin )
        return 1;
    for( char s[9]; fgets(s,9,fin); )
    {
        if( s[0] == '@' ) // 遇到@则结束
            break;
        ++words;
        size_t len = strlen(s);
        if( len < 8 ) // 此行不足8个字符
            continue;
        if( s[len-1] == '\n' ) // 此行不足8个字符
            continue;

        unsigned long val = dna8_str2val(s);
        if( val == -1ul ) // 出现了agct之外的字符
        {
            fclose( fin );
            return 2;
        }
        ++numbers[val];

        for( int c; c=fgetc(fin), c!=EOF; )
        {
            if( c == '\n' ) // 遇到回车说明此行结束
                break;
            val = (val<<2)&0xFFFF;
            switch( (char)c )
            {
            case 'a': val|=0; break;
            case 'g': val|=1; break;
            case 'c': val|=2; break;
            case 't': val|=3; break;
            default: // 出现了agct之外的字符
                fclose( fin );
                return 2;
            }
            ++numbers[val];
        }
    }
    fclose( fin );

    // 输出
    FILE* fout = fopen( "result2.txt", "w" );
    if( !fout )
        return 3;
    fprintf( fout, "The Number of total words are %ld\n", words );
    fprintf( fout,"The Expect Number words are %f\n", words/65536.0 );
    for( int i=0; i<65536; ++i )
    {
        if( numbers[i] !=0 )
        {
            char str[8];
            dna8_val2str( i, str );
            fprintf( fout, "%.8s\t%ld\t%f\n", str, numbers[i], numbers[i]/65536.0 );
        }
    }
    fclose( fout );

    return 0;
}

测试,result1.txt 内容如下
aaaaaaaaa
aaaaaaaag
aaaaaaaac
@

输出的 result2.txt 内容如下
The Number of total words are 3
The Expect Number words are 0.000046
aaaaaaaa    4    0.000061
aaaaaaag    1    0.000015
aaaaaaac    1    0.000015


[ 本帖最后由 rjsp 于 2012-11-10 13:52 编辑 ]
2012-11-09 14:51
mmmmmmmmmmmm
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:8
帖 子:388
专家分:1809
注 册:2012-11-2
得分:0 
好多循环

我们的目标只有一个:消灭0回复!
while(1)
++money;
2012-11-09 14:57
a13780393
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2012-10-6
得分:0 
回复 2楼 rjsp
非常感谢这位仁兄,其实这个文件里只有acgt这四种字母,没有其它的。所以不用遇到其他字母或者汉字怎么办。你能否再改一下啊?修正一下。
2012-11-09 16:41
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 4楼 a13780393
改了干球呀,不用改,就这么用
2012-11-09 16:44
a13780393
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2012-10-6
得分:0 
回复 2楼 rjsp
也没有空格,就是一个挨着一个的排列,但需要步长为1,逐个向后推,出现一个就计数一个,步长不是8
2012-11-09 16:46
a13780393
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2012-10-6
得分:0 
回复 5楼 rjsp
输出结果不对啊,以你给出的文件举例,aaaaaaaa出现的频率为10才对(17-8+1),遇到回车往下接下才行。
2012-11-09 16:50
a13780393
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2012-10-6
得分:0 
回复 5楼 rjsp
仁兄,现在就一个问题了,我刚才试了一下,我的文件1的字符串非常大,有17亿个字符,这个程序我一运行,就停止工作了,方法没有错误,就是一运行就停止。我的那个程序,专门设置了一个静态变量,所以避免了这个问题,能运行。你的这个哪里需要改一下啊?
2012-11-09 17:05
a13780393
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2012-10-6
得分:0 
回复 5楼 rjsp
加个QQ吧?我把文件传给你你看一下,为什么在我这无法运行
2012-11-09 17:19
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用a13780393在2012-11-9 16:50:12的发言:

输出结果不对啊,以你给出的文件举例,aaaaaaaa出现的频率为10才对(17-8+1),遇到回车往下接下才行。
用你自己的程序,输出就是4
2012-11-10 08:59



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-386526-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.097753 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved