| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1194 人关注过本帖, 1 人收藏
标题:还是老问题,请各位帮忙!
取消只看楼主 加入收藏
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
结帖率:93.94%
收藏(1)
已结贴  问题点数:30 回复次数:11 
还是老问题,请各位帮忙!
随机序列.rar (1.39 MB)
    这是500万长度的随机序列,由A、T、C、G四个字母组成。
八模体及其出现次数.zip (233.39 KB)
    这是对应附件得到的结果模式,4的8次幂个八模体及其各自的出现次数。
8模体由8个碱基构成,(碱基即A、T、C、G)每个碱基有4种选择(或A、或T、或C、或G),这样就有4的8次幂种8模体(即65536种)。
附件1中的随机序列包含500万个字符,如果以1为间隔的话,应有 4999993个 8模体,因为每[i,i+7]位置区域上的8个碱基长的字符串都是一个8模体,i从0开始,直到4999992结束,i是i++逐渐增加的,附件2的结果就是在以1为间隔下得到的。   4999993个8模体由65536种8模体组成,附件2中的结果就是在4999993个8模体中每种8模体出现了多少次。
                                  如果以2为间隔的话,应有 2499996个 8模体,因为每[i,i+7]位置区域上的8个碱基长的字符串都是一个8模体,i从0开始,直到4999992结束,i是i+=2逐渐增加的。
                                  如果以k为间隔的话,应有 500万除k个 8模体,因为每[i,i+7]位置区域上的8个碱基长的字符串都是一个8模体,i从0开始,i是i+=k逐渐增加的,直到i+7>4999999结束。
                                  现在我能计算以1为间隔的,但以k为间隔的程序实在弄不出来。我是学物理的学生,计算机这块有些棘手,麻烦各位了。
谢谢。
这是统计以1为间隔的程序。
#include <stdio.h>

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

int main()
{
    static unsigned long octamer_count[N_B] = { 0 };    //当跑八模体以上时,因为数据量已经很大,要价个static,八模体以下不用它

    ////// 1 //////
    {
        FILE* file = fopen( "E:\\酵母\\光学与信息学\\碱基随机.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( "E:\\酵母\\光学与信息学\\碱基随机9模体.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, "\t%u\n", octamer_count[i] );
            }
        }
        fclose( fileout );
    }

    return 0;
}
搜索更多相关主题的帖子: 字符串 字母 
2014-04-20 16:10
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用azzbcc在2014-4-20 17:36:07的发言:

试试 fseek

求指教!!!
谢谢!!!
2014-04-21 09:17
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用wp231957在2014-4-21 09:34:25的发言:

看不懂你说的东东
能不能具体举例一下

比如 :
    你说的是不是从一个字符串中扫描所有可能存在的子字符串(是定长还是不定长)
    比如:ABCDEFGH   如果以3为间隔、定长为2的话  如何取  AB DE GH  ???

GGATATGTGAATTATGGTTATCTTGGTAATAGCAGAGCCCGGAGTGCGCGTAACGTGACACTGGGCCGAAGATGTACCTCGTTATATACCTGAAAGCGTG
上面是一个序列样本,100个字母长(字母只有A、T、C、G),计算2模体(2模体由两个字母组成,每个字母有4种选择,所以共16个2模体,这16个2模体包括AA、AT、AC、AG、TA、TC、TT、TG、CA、CC、CT、CG、GC、GT、GA、GG)。当以1为间隔统时100字母长的序列中2模体出现了99次,我现在要统计在2模体出现的这99次中上述16种2模体分别各出现了多少次。
                      当以2为间隔统时100字母长的序列中2模体出现了50次,我现在要统计在2模体出现的这50次中上述16种2模体分别各出现了多少次。
                      当以3为间隔统时100字母长的序列中2模体出现了33次,我现在要统计在2模体出现的这33次中上述16种2模体分别各出现了多少次。
                      以此类推。
      当然还要依此统计3模体、4模体、5模体等与上述同样的出现情况。
麻烦您了!!!
2014-04-21 10:30
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 6 楼 wp231957
您好,非常感谢您。
我要的结果是扫描到的33个模体中每种2模体出现的次数,需要单独输出一个文件。
另外,序列100长只是一个简便的举例,实际长度是能有一亿多长度的。而且在计算8模体时,8模体的种类也是有65536个的(2模体有16种,即AA、AT、AC、AG等),
所以序列有一些实际操作的难度呀。
2014-04-21 10:57
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用wp231957在2014-4-21 11:03:44的发言:



1、这个8模体的生成 需要电脑生成  不能像我代码那样硬编码
2、单独输出一个文件 这个不是问题
3、源文件太大的话  估计运行时间是个问题 而这个问题咋弄都是遍历  是需要大量时间的


1、是的,因为我要算k模体,k可能会是10,这样依照2模体有16种模体的理论,他就有4的10次幂个,即65536乘16个。
2、另外,就像我刚才举的例子,100长度,以1为间隔能读到99个二模体,以2为间隔能读到50个2模体,所以还要麻烦一下设置为能随意间隔读取。
3、对,源文件很大,所以比较麻烦。
谢谢!!!!!
2014-04-21 11:16
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用wp231957在2014-4-21 11:21:36的发言:


第一个问题你有代码没   我对全排列不咋熟悉  你有现成代码最好
第二个问题不是问题
第三个问题没有办法


我也没有代码。
只有最上面那个程序,是以1为间隔计算8模体中每种8模体出现次数的。
但这个程序无法以2、3、4、5等为间隔。
2014-04-21 11:35
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用rjsp在2014-4-21 12:00:07的发言:

没看懂,说明中说是“八模体”,代码中似乎为“9模体”,你到底要什么?

难道你要 以k为间隔的n模体?
如是的话,限制条件是什么?
0<k<=n?
n有没有什么限制,比如n<100?

 
因为我要做k模体的(k取30以内的任意数)。

因为每[i,i+7]区域位置上的8个字符就是一个8模体,i从0开始,直到字符串结束。以1为间隔,则i是i++形式的;以2为间隔,则i是i+=2逐渐增加的,依此类推。
2014-04-21 13:49
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用rjsp在2014-4-21 14:03:21的发言:

好累呀,听不懂

题目中说八模体,代码中是9模体
问你后,回答说k模体,“因为”后却是八模体

最后一次,是要“以k为间隔的8模体”,还是“以k为间隔的9模体”,还是“以k为间隔的n模体”?

对不起,是我说的太含糊了。
是以k为间隔的n模体。
2014-04-21 16:03
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用rjsp在2014-4-21 14:03:21的发言:

好累呀,听不懂

题目中说八模体,代码中是9模体
问你后,回答说k模体,“因为”后却是八模体

最后一次,是要“以k为间隔的8模体”,还是“以k为间隔的9模体”,还是“以k为间隔的n模体”?

k无限制,且k与n无关系。n取20以内任意值。
2014-04-21 16:05
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用wp231957在2014-4-21 16:25:47的发言:

在网上找到了一个符合你这个需求的全排列代码


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int count=0;

/*
 * 加1后进位操作
 * 用字符串模拟数字的进位操作
 */
void add_one(int *array, int array_len, int radio, int *flow)
{
        int i;
        for ( i=array_len-1; i>=0; i-- )
        {
                array += 1;
                //没有进位就退出
                if (array < radio) return; else array = 0;                        
        }
        // 最高位溢出 - 标志进位操作已经结束
        (*flow) = 1;
}

/*
 * 获取全排列
 */
int get_pailie(char *set, int set_len, int sub_len, char *out, int out_len)
{
        int  end_flag = 0;
        int *array    = NULL;
        int  i = 0;
        if ( NULL==set || NULL==out || out_len<sub_len ) return -1;
        if ( (array=(int *)malloc(sub_len * sizeof(int))) == NULL ) return -2;
        // 初始化整数集合为0
        for( i=0; i<sub_len; i++ )  array = 0;
        while( 1 != end_flag )
        {
                for(i=0; i<sub_len; i++)out = set[array];// 输出结果的每一位与它对应的数的每一位相同
                printf("%9s", out);
                if(count%8==0) printf("\n");
                count++;
                // 下标+1
                add_one(array, sub_len, set_len, &end_flag);
        }
        free(array);
        return 0;
}

int main(void)
{
        char *set="ACGT";
        char  out[9] = {0};
        int   set_len = 4;
        int   sub_len = 8;
        get_pailie(set, set_len, sub_len, out, sub_len);
        printf("\n共有组合(含重复数据)%d组\n",count);
        return 0;        
}


您好,首先谢谢您。
但这个程序只能建立4的n次幂个8模体。
统计不了次数,也无法间隔计数。
2014-04-21 16:59
快速回复:还是老问题,请各位帮忙!
数据加载中...
 
   



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

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