DNA序列分析

来源:互联网 发布:mac字体安装后找不到 编辑:程序博客网 时间:2024/05/12 05:55

刚刚参加了2013东北地区数学建模,完成了B题,第一次真正意义上接触到了大数据处理的工作,时间与空间的相互转化关系真的只有通过实践才能切身体会到,此言得之。现在记录代码如下:

#define _CRT_SECURE_NO_WARNINGS#include <Windows.h>#include <iostream>#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <math.h>#include <vector>#include <cstdlib>#include <time.h>#define MAX 4#define SIZE 1000#define MAXNODENUM 1000000//***************************////结构体定义//***************************//typedef struct Result{    int Position;    struct Result *nextone;}List_t;typedef struct TrieNode                     {    List_t *head;    int isStr;                                struct TrieNode *next[MAX];}Trie;Trie* getNewNode() {     Trie *Block = (Trie*)malloc(sizeof(Trie) );    Block->head = NULL;    return Block ;}//***************************////建立四字字典树//***************************//void insert(Trie *root, const char *s, int cishu,int xuhao){    if (root == NULL || *s == '\0')        return;    int i;    Trie *p = root;    while (*s != '\0')    {        if (p->next[*s - 'A'] == NULL)               {            Trie *temp = getNewNode();            for (i = 0; i<MAX; i++)            {                temp->next[i] = NULL;            }            temp->isStr = false;            p->next[*s - 'A'] = temp;            p = p->next[*s - 'A'];        }        else        {            p = p->next[*s - 'A'];        }        s++;    }    Insert_List(&(p->head), cishu,xuhao);}//***************************////建立终端链表//***************************//void Insert_List(List_t* *head, int num,int xuhao){    List_t *p = *head;    List_t *node = (List_t *)malloc(sizeof(List_t));    node->Position = num;    node->nextone = *head;    *head = node;}//***************************////显示结果//***************************//void Show_List(List_t *head){    List_t *p;    p = head;    int weizhi,order;    while (p)    {        weizhi=p->Position;                    order=ceil(weizhi/100);        weizhi=weizhi-order*100;        printf("[%d]",order);        printf("%d ",weizhi);        p = p->nextone;    }}//***************************////查询相关字符串//***************************//void search(Trie *root, const char *s){    char panduan;    Trie *p = root;    while (p != NULL&&*s != '\0')    {        p = p->next[*s - 'A'];        s++;    }    Show_List(p->head);}//***************************////主函数//***************************//int main(){    FILE   *fp;    char   filename[100];    char  str[1000];    char buf[1000];    char panduan;    double BuildStart,BuildFinish;        //索引建立开始时间与结束时间    double SearchStart,SearchFinish;     //查询建立开始时间与结束时间    int i = 0;    int j = 0;    int  k = 0;    long long int v = 0;int point=0;    char buffer[SIZE];    char search1[100];    int order = 0;   fp=fopen("chuli.txt", "rt");             //文件指针指向数据文件    if(fp==NULL)    {        printf("cannot open file\n");        return 0;    }    printf("Input the k\n");    scanf("%d", &k);    printf("Input the search string\n");    scanf("%s", search1);    for(i=0;i<k;i++)                 //将输入的字符串进行映射处理    {            panduan=search1[i];            switch (panduan-'A')      //将A、C、G、T映射成A、B、C、D            {              case 0:  search1[i]=search1[j];  break;              case 0x2:  search1[i]='B';   break;              case 0x6:  search1[i]='C';   break;              case 0x13:  search1[i]='D';   break;              default :   break;            }    }    Trie *root1 = getNewNode();    for (i = 0; i<MAX; i++)    {        root1->next[i] = NULL;    }     BuildStart=(double)clock();     //获取索引建立开始时间    for (v = 0;v < 1000000;v++)      //建立四字字典树    {        fgets(str,1000,fp);        sscanf(str,"%s",str);        j = 0;        while (str[j] != '\0')        {            for (i = 0; i < k; i++)            {                buffer[i] = str[i + j];            }            buffer[k] = '\0';            j++;            point++;            insert(root1, buffer,point,v+1);        }        point+k;    }    BuildFinish=(double)clock();    //获取索引建立结束时间    SearchStart=(double)clock();    //获取查询开始时间    search(root1, search1);          //查询字符串    SearchFinish=(double)clock();    //获取查询结束时间    fclose(fp);    printf("buildtime:%f\t",(BuildFinish-BuildStart)/1000);   //打印索引建立时间    printf("searchtime:%f",(SearchFinish-SearchStart)/1000);  //打印查询时间    return 0;}


0 0