| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1134 人关注过本帖, 1 人收藏
标题:程序运行缓慢,望赐教改进!!!
只看楼主 加入收藏
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
问题进一步清晰了,但还是不够精确。呵呵,我想你是为了分析你的专业课题才学的编程吧。

现在输入数据这块我清楚了,但对于输出这块还是不明晰。这样吧,不如我来描述一下我理解的输出数据格式,你看是否满足你的要求。

对了,对于四个碱基A、T、C、G在你的专业里有没有个传统的顺序?

输出数据开始部分为每个N模体的数据占一行,格式为

XXXXXXXX K

其中X为每个N模体的碱基序列,K为出现次数,中间以空格分隔

例如
AAAAAAAA 1
AAAAAAAT 3
AAAAAAAC 15
...

输出完所有N模体的数据后,紧接着下一行开始输出统计部分,每组统计占一行,格式为

T C

其中T为出现次数,C为对应次数的N模体数量,中间在空格分隔

例如
0 15
1 40
2 500
3 0
...

统计部分输出完毕后文件结束。

这个格式怎么样?

重剑无锋,大巧不工
2013-03-12 20:53
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
对了,还忘了一个问题,你的输入数据中,N会不会出现在序列的中间?如果会,你希望怎么处理。

尽快回复,今天协商妥了这些问题,明天你就能看到你等了十几天的统计数据了。

初步,我打算把你的N模体,N限制在10以内。至于二十模体,呵呵,输出文件得有几十个T大,你的内存和硬盘都吃不消的。

重剑无锋,大巧不工
2013-03-12 21:22
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 11楼 beyondyf
您好,没错,因为我是搞基因序列的,所以需要大量编程,这C语言也是后期自学的,不精。
A、T、C、G没有固定的排列顺序,在八模体中每个位置的碱基选择都是任意的。
您理解的输出格式是对的,就那样就很好。只是我的理解的话,您说的数据间的空格,应该是用制表符完成的吧,不是用
fprintf(fp,"%s\t%d\n",  ,      )这样完成把数据输出到txt文件里吧!
2013-03-12 21:32
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用beyondyf在2013-3-12 21:22:31的发言:

对了,还忘了一个问题,你的输入数据中,N会不会出现在序列的中间?如果会,你希望怎么处理。

尽快回复,今天协商妥了这些问题,明天你就能看到你等了十几天的统计数据了。

初步,我打算把你的N模体,N限制在10以内。至于二十模体,呵呵,输出文件得有几十个T大,你的内存和硬盘都吃不消的。
N不会在序列的中间,这个未知碱基只会出现在碱基序列的最前端,中间是不会出现的!!!
     N限制在10以内就行,因为我通常分析较多的是N等于4、6、8、10的N模体情况,我估计10模体得到的结果也很大吧!!
再次谢谢您,帮了我这么大的忙!!!!!!
2013-03-12 21:37
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,这就是用户需求调查。之前我一直问你输出格式方面的要求,这用制表符分隔就是你的要求,我需要知道的就是这些精确的细节。

碱基要是没有顺序要求,那我就自己定义顺序了,就ATCG了。输出的模体顺序将是

AAAA
AAAT
AAAC
AAAG
AATA
AATT
AATC
AATG
...

今天有点晚了,明天晚上记得上线来验收我的程序,呵呵。

重剑无锋,大巧不工
2013-03-12 21:44
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 15楼 beyondyf
好的,谢谢!
2013-03-12 21:46
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
完成了。分析统计你的“结果22”在我电脑上大概3秒左右。

简单介绍一下程序的运行方法。

程序带一个参数,即模体的长度N,通过这个参数程序可以计算10以内的所有模体统计。

输入输出通过流的重定向完成。不理解没关系,按照下面的例子来就可以。

假设程序的可执行文件及输入文件在同一目录下

设可执行文件名为dna.exe, 输入文件名为data_in.txt,输出文件准备命名为data_out.txt

打开控制台窗口,并切换到程序所在目录,执行

dna 8 <data_in.txt >data_out.txt

等程序执行完后,就可以在当前目录下去查看生成的data_out.txt文件了,建议别用记事本打开。

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

#define MOTIF_LEN_MIN    1
#define MOTIF_LEN_MAX    10

int trans_base(int base)
{
    switch(base)
    {
        case 'A' : return 0;
        case 'T' : return 1;
        case 'C' : return 2;
        case 'G' : return 3;
    }
    return -1;
}

int main(int argc, char ** argv)
{
    int * motif_group, * count_group;
    int motif_len, group_len, count_max, motif, base, mark;
    int i, j;
    char *base_name = "ATCG", *tail;
   
    if(argc != 2) return 1;
    motif_len = strtol(argv[1], &tail, 0);
    if(*tail != '\0' || motif_len < MOTIF_LEN_MIN || motif_len > MOTIF_LEN_MAX)
        return 1;
   
    group_len = 1 << (motif_len * 2);
    mark = ~(-1 << (motif_len * 2));
   
    motif_group = (int *)malloc(group_len * sizeof(int));
    if(motif_group == NULL) return 1;
    memset(motif_group, 0, group_len * sizeof(int));
   
    for(motif = 0, i = motif_len - 1; i && (base = getchar()) != EOF;)
        if((base = trans_base(base)) >= 0)
        {
            motif = (motif << 2) + base;
            i--;
        }
       
    for(count_max = 0; (base = getchar()) != EOF;)
        if((base = trans_base(base)) >= 0)
        {
            motif_group[motif = ((motif << 2) + base) & mark]++;
            if(motif_group[motif] > count_max) count_max = motif_group[motif];
        }
       
    count_group = (int *)malloc((count_max + 1) * sizeof(int));
    if(count_group == NULL) return 1;
    memset(count_group, 0, (count_max + 1) * sizeof(int));
       
    for(i = 0; i < group_len; i++)
    {
        for(j = motif_len - 1; j >= 0; j--)
            putchar(base_name[(i >> (j * 2)) & 3]);
        printf("\t%d\n", motif_group[i]);
        count_group[motif_group[i]]++;
    }
   
    for(i = 0; i <= count_max; i++)
        printf("%d\t%d\n", i, count_group[i]);
   
    free(motif_group);
    free(count_group);
    return 0;
}

重剑无锋,大巧不工
2013-03-13 15:52
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
附送一份“结果22”的统计结果数据
out.rar (242.22 KB)

重剑无锋,大巧不工
2013-03-13 15:56
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
谢谢您,非常感谢!!!!!
以后多多指教!
2013-03-13 16:57
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 18楼 beyondyf
谢谢您,非常感谢!!!
2013-03-13 16:58
快速回复:程序运行缓慢,望赐教改进!!!
数据加载中...
 
   



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

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