| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 955 人关注过本帖
标题:这段程序要怎么改才能运行更快
取消只看楼主 加入收藏
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
结帖率:93.94%
收藏
已结贴  问题点数:20 回复次数:7 
这段程序要怎么改才能运行更快
for(i=0;i<95000000;i++)                      //以下四行用来判断str中各个三联体出现次数
 for(h=0;h<N;h++)
   if(lead[h].name[0]==str[i]&&lead[h].name[1]==str[i+1]&&lead[h].name[2]==str[i+2]&&lead[h].name[3]==str[i+3]
     &&lead[h].name[4]==str[i+4]&&lead[h].name[5]==str[i+5]&&lead[h].name[6]==str[i+6]&&lead[h].name[7]==str[i+7])
   lead[h].number++;

这个运行的很慢,有没有更好的方法呢,谢谢!!!!!!
2013-03-12 17:45
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用pauljames在2013-3-12 17:57:13的发言:

if里面的东西太多了吧,而且是双重循环
如果要达到同样目的,怎么办?
谢谢!!!
2013-03-12 19:18
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用rjsp在2013-3-13 10:12:29的发言:

#include  
 
int main()
{
    unsigned long octamer_count[65536] = { 0 };
 
    ////// 1 //////
    {
        FILE* file = fopen( "result22.txt", "rb" );
        if( !file )
        {
            puts( "cannot open the input file.");
            return 1;
        }
        {
            unsigned long octamer;
            unsigned long octamer_n = 0;
            char c;
            for( ; fread(&c,1,1,file)==1; )
            {
                switch( c )
                {
                    case 'A':
                        octamer = (octamer*4+0)%65536; ++octamer_n; break;
                    case 'T':
                        octamer = (octamer*4+1)%65536; ++octamer_n; break;
                    case 'C':
                        octamer = (octamer*4+2)%65536; ++octamer_n; break;
                    case 'G':
                        octamer = (octamer*4+3)%65536; ++octamer_n; break;
                    case '\r':
                    case '\n':
                        continue;
                    default:
                        puts( "Fuck" );
                    case 'N':
                        octamer_n = 0;
                        continue;
                }
                if( octamer_n < 8 )
                    continue;
                octamer_n = 8;
 
                ++octamer_count[octamer];
            }
        }
        fclose( file );
    }
 
    ////// 2 //////
    {
        FILE* fileout = fopen( "result22_ouput.txt", "wt" );
        if( !fileout )
        {
            puts( "cannot open the output file.");
            return 2;
        }
        {
            unsigned int i, j;
            for( i=0; i

您好    您编的程序比我的那个强很多,我只是有个小疑问,因为正常结果应该是4的8次幂,也就是65536组对应数据,您的输出是65608个,多了72个,我刚才检查了一下,没看出来,望您再看看,是怎么回事!!!谢谢!!
2013-03-13 11:10
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用rjsp在2013-3-13 13:15:39的发言:

你总得告诉我输入文件内容吧?!

我用你以前发的那个“结果22.txt”输出是65534行,之所以少两行,是因为我没有输出数量为0的八联体。如果你想全输出,只要将
if( octamer_count == 0 )
    continue;
删除掉就行了
输入文件其实就是看作有几千万个碱基字符构成的一个字符串,碱基字符只有A、T、C、G四种,N只是未知碱基,不只是四种中的哪一个。
请问一下,我刚才想试着改成六联体,但老是不对,请问怎么改呀?   
我的想法是65536改成4096
(octamer*4+0)%65536;    将4改成3

if( octamer_n < 8 )
                    continue;
                octamer_n = 8;     8改成6

for( j=65536/4; j!=0; j/=4 )       4改成3
但是不对,请问哪错了呀,谢谢!!!!
2013-03-13 13:40
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用rjsp在2013-3-13 13:56:48的发言:

一个问题一个问题的来,别一下子连扯几个问题,混乱得都不知道谁和谁。

还是一开始的问题,你说“您的输出是65608个,多了72个”,请给出你的测试文件。
不好意思,当时我操作好像有错误,现在运行对了,非常抱歉!!!!

那我要就最新的问题说了,我要改成六联体,我的那种改法哪里错了?谢谢!!!
2013-03-13 15:38
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 15楼 rjsp
非常谢谢您,完全对了,谢谢!!!
2013-03-13 16:18
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 15楼 rjsp

#define N_B (1u<<(2*N_A))     这个(1u<<(2*N_A))是计算4的6次幂的,对吧?

                        case 'G':
                        octamer = (octamer*4+3)%N_B; ++octamer_n; break;    octamer*4+3,乘4加3什么意思呀?
                  
        
            for( i=0; i<sizeof(octamer_count)/sizeof(octamer_count[0]); ++i )     sizeof(octamer_count)/sizeof(octamer_count[0 ]它是用来得到4096吧?
           
                for( j=N_B/4; j!=0; j/=4 )          这一行有点看不懂
                    fprintf( fileout, "%c", "ATCG"[i/j%4] );   
         
谢谢了,请您指教!!!!!
2013-03-13 16:29
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 18楼 rjsp
非常感谢   这下完全看懂了   谢谢您!!!!!
2013-03-13 16:50
快速回复:这段程序要怎么改才能运行更快
数据加载中...
 
   



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

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