| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 955 人关注过本帖
标题:这段程序要怎么改才能运行更快
只看楼主 加入收藏
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9030
专家分:54050
注 册:2011-1-18
收藏
得分:0 
回复 10楼 zhou31146001
你总得告诉我输入文件内容吧?!

我用你以前发的那个“结果22.txt”输出是65534行,之所以少两行,是因为我没有输出数量为0的八联体。如果你想全输出,只要将
if( octamer_count[i] == 0 )
    continue;
删除掉就行了
2013-03-13 13:15
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
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9030
专家分:54050
注 册:2011-1-18
收藏
得分:0 
回复 12楼 zhou31146001
一个问题一个问题的来,别一下子连扯几个问题,混乱得都不知道谁和谁。

还是一开始的问题,你说“您的输出是65608个,多了72个”,请给出你的测试文件。
2013-03-13 13:56
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用rjsp在2013-3-13 13:56:48的发言:

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

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

那我要就最新的问题说了,我要改成六联体,我的那种改法哪里错了?谢谢!!!
2013-03-13 15:38
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9030
专家分:54050
注 册:2011-1-18
收藏
得分:0 
回复 14楼 zhou31146001
将下面代码中的 #define N_A 8 改为 #define N_A 6 就行了

程序代码:
#include <stdio.h>

#define N_A 8
#define N_B (1u<<(2*N_A))

int main()
{
    unsigned long octamer_count[N_B] = { 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)%N_B; ++octamer_n; break;
                    case 'T':
                        octamer = (octamer*4+1)%N_B; ++octamer_n; break;
                    case 'C':
                        octamer = (octamer*4+2)%N_B; ++octamer_n; break;
                    case 'G':
                        octamer = (octamer*4+3)%N_B; ++octamer_n; break;
                    case '\r':
                    case '\n':
                        continue;
                    default:
                        puts( "Fuck" );
                    case 'N':
                        octamer_n = 0;
                        continue;
                }
                if( octamer_n < N_A )
                    continue;
                octamer_n = N_A;

                ++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<sizeof(octamer_count)/sizeof(octamer_count[0]); ++i )
            {
                if( octamer_count[i] == 0 )
                    continue;
                for( j=N_B/4; j!=0; j/=4 )
                    fprintf( fileout, "%c", "ATCG"[i/j%4] );
                fprintf( fileout, " %u\n", octamer_count[i] );
            }
        }
        fclose( fileout );
    }

    return 0;
}

2013-03-13 15:53
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
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9030
专家分:54050
注 册:2011-1-18
收藏
得分:0 
#define N_B (1u<<(2*N_A))     这个(1u<<(2*N_A))是计算4的6次幂的,对吧?
------ 对

octamer*4+3,乘4加3什么意思呀?
------ 将ATCG分别看作0123,则ATCG组成的任何字符串都可以表示为一个4进制的数
比如 GTCC 就是4进制的3122,4进制的3122 换成数就是 (((0*4+3)*4+1)*4+2)*4+2=218

sizeof(octamer_count)/sizeof(octamer_count[0 ]它是用来得到4096吧?
------ 对,求数组的元素数目

for( j=N_B/4; j!=0; j/=4 )          这一行有点看不懂
------ 如果问题“octamer*4+3,乘4加3什么意思呀?”看懂了,这个就是将一个数再回到4进制去
2013-03-13 16:42
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.032715 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved