免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: bioinfor
打印 上一主题 下一主题

两道题,问了N多人,没结果,再问一下看看 [复制链接]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
41 [报告]
发表于 2004-12-17 09:05 |只看该作者

两道题,问了N多人,没结果,再问一下看看

[quote]原帖由 "lightspeed"]3) 每个匹配串必须包括全部 ACGT 四个字符。(这是才是有效的基因片断)[/quote 发表:

把程序改一下
  1. #include <stdio.h>;
  2. #include <stdlib.h>;
  3. #include <string.h>;
  4. #include <time.h>;

  5. #define MAXSIZE  10000
  6. #define MINMATCH 10
  7. #define AF       0x01
  8. #define CF       0x02
  9. #define GF       0x04
  10. #define TF       0x08
  11. #define FULLFLAG 0x0F

  12. char strUnit[] = {'A', 'C', 'G', 'T'};
  13. unsigned char hGeneFlag;

  14. int GenQueue(char *strQueue) {
  15.     time_t  ck;
  16.     int     nQueueSize,i;

  17.     if(strQueue == NULL) return 0;
  18.     memset(strQueue, 0, MAXSIZE);

  19.     ck = time(NULL);
  20.     srand(ck);
  21.     nQueueSize = rand() % MAXSIZE;

  22. nQueueSize = MAXSIZE;
  23.     for(i = 0; i < nQueueSize; i++) {
  24.         strQueue[i] = strUnit[rand() % 4];
  25.     }
  26.     return nQueueSize;
  27. }

  28. int MatchVerted(char *strQueue, int nQueueSize) {
  29.     char *pQueue, strMatch[MAXSIZE / 2 + 1];
  30.     int  i, nMatchLen, nBegin, nFlag, nPosition;

  31.     printf("\nVerted Repeat:\n");

  32.     for(nBegin = MINMATCH; nBegin < nQueueSize - MINMATCH; nBegin++) {
  33.         pQueue = strQueue + nBegin;
  34.         nMatchLen = 0;
  35.         nFlag = 0;
  36.         hGeneFlag = 0;
  37.         for(i = 0; i <= nQueueSize - nBegin; i++) {
  38.             if(strQueue[i] == pQueue[i]) {
  39.                 if(nFlag == 0) {
  40.                     nFlag = 1;
  41.                     nPosition = i;
  42.                 }
  43.                 switch(strQueue[i]) {
  44.                     case 'A':
  45.                         hGeneFlag |= AF;
  46.                         break;
  47.                     case 'C':
  48.                         hGeneFlag |= CF;
  49.                         break;
  50.                     case 'G':
  51.                         hGeneFlag |= GF;
  52.                         break;
  53.                     case 'T':
  54.                         hGeneFlag |= TF;
  55.                         break;
  56.                 }
  57.                 strMatch[nMatchLen++] = strQueue[i];
  58.                 if(nMatchLen >;= nBegin && hGeneFlag == FULLFLAG) {
  59.                     strMatch[nMatchLen] = 0;
  60.                     printf("Repeat:%s, Size: %d, Start Positioins:%d, %d\n", strMatch, nMatchLen, nPosition, nPosition + nBegin);
  61.                     nFlag = 0;
  62.                     nPosition = 0;
  63.                     nMatchLen = 0;
  64.                 }
  65.             }
  66.             else {
  67.                 if(nFlag == 1) {
  68.                     if(nMatchLen >;= MINMATCH && hGeneFlag == FULLFLAG) {
  69.                         strMatch[nMatchLen] = 0;
  70.                         printf("Repeat:%s, Size: %d, Start Positioins:%d, %d\n", strMatch, nMatchLen, nPosition, nPosition + nBegin);
  71.                     }
  72.                     nFlag = 0;
  73.                     nPosition = 0;
  74.                     nMatchLen = 0;
  75.                 }
  76.             }
  77.         }
  78.     }
  79. }

  80. int MatchInverted(char *strQueue, int nQueueSize) {
  81.     char *pQueue, strMatch[MAXSIZE / 2 + 1];
  82.     int  i, nMatchLen, nBegin, nFlag, nPosition;

  83.     printf("\nInverted Repeat:\n");

  84.     for(nBegin = 0; nBegin < nQueueSize - 2 * MINMATCH; nBegin++) {
  85.         pQueue = strQueue + nQueueSize - 1 - nBegin;
  86.         nMatchLen = 0;
  87.         nFlag = 0;
  88.         hGeneFlag = 0;
  89.         for(i = 0; i < (nQueueSize - nBegin) / 2; i++, pQueue--) {
  90.             if(strQueue[i] == *pQueue) {
  91.                 if(nFlag == 0) {
  92.                     nFlag = 1;
  93.                     nPosition = i;
  94.                 }
  95.                 switch(strQueue[i]) {
  96.                     case 'A':
  97.                         hGeneFlag |= AF;
  98.                         break;
  99.                     case 'C':
  100.                         hGeneFlag |= CF;
  101.                         break;
  102.                     case 'G':
  103.                         hGeneFlag |= GF;
  104.                         break;
  105.                     case 'T':
  106.                         hGeneFlag |= TF;
  107.                         break;
  108.                 }
  109.                 strMatch[nMatchLen++] = strQueue[i];
  110.             }
  111.             else {
  112.                 if(nFlag == 1) {
  113.                     if(nMatchLen >;= MINMATCH && hGeneFlag == FULLFLAG) {
  114.                         strMatch[nMatchLen] = 0;
  115.                         printf("Repeat:%s, Size: %d, Start Positioins:%d, %d\n", strMatch, nMatchLen, nPosition, pQueue - strQueue + 1);
  116.                     }
  117.                     nFlag = 0;
  118.                     nPosition = 0;
  119.                     nMatchLen = 0;
  120.                 }
  121.             }
  122.         }
  123.         if(nMatchLen >;= MINMATCH && hGeneFlag == FULLFLAG) {
  124.             strMatch[nMatchLen] = 0;
  125.             printf("Repeat:%s, Size: %d, Start Positioins:%d, %d\n", strMatch, nMatchLen, nPosition, pQueue - strQueue + 1);
  126.         }
  127.     }
  128. }

  129. int main(void) {
  130.     char strQueue[MAXSIZE];
  131.     int nQueueSize;

  132.     nQueueSize = GenQueue(strQueue);
  133.     printf("String:\n%s\n", strQueue);

  134.     MatchVerted(strQueue, nQueueSize);
  135.     MatchInverted(strQueue, nQueueSize);
  136. }

复制代码

长度为10000时

real    0m2.99s
user    0m2.98s
sys     0m0.01s

长度为100000时
real    5m0.26s
user    4m58.18s
sys     0m1.24s

论坛徽章:
0
42 [报告]
发表于 2004-12-17 11:14 |只看该作者

两道题,问了N多人,没结果,再问一下看看

真的是好强啊!我是十分的佩服,希望可以盒大家做一很好朋友,哈哈~~~不知道你们是不是给一个机会哦。
哈哈~~~·

论坛徽章:
0
43 [报告]
发表于 2004-12-17 19:21 |只看该作者

两道题,问了N多人,没结果,再问一下看看

//我将yuxh老大与lightspeed老大的程序运行比较如下:
//用yuxh老大的将10000个字符的data运行了一下,结果如下:
  1. Verted Repeat:
  2. Repeat:AACACAGGGA, Size: 10, Start Positioins:8416, 8471
  3. Repeat:TGATATATCA, Size: 10, Start Positioins:5523, 5588
  4. Repeat:TCGGTATTCAA, Size: 11, Start Positioins:1538, 1819
  5. Repeat:CCACGCTGAT, Size: 10, Start Positioins:1760, 2065
  6. Repeat:AGACTTTACC, Size: 10, Start Positioins:3304, 3860
  7. Repeat:CTCTTGTGCTTA, Size: 12, Start Positioins:4218, 4991
  8. Repeat:AAAACCACTGA, Size: 11, Start Positioins:3877, 4742
  9. Repeat:CCTCGATTGG, Size: 10, Start Positioins:601, 1599
  10. Repeat:TAGACGGCGC, Size: 10, Start Positioins:4364, 5496
  11. Repeat:CCCTGAAAAGC, Size: 11, Start Positioins:6395, 7680
  12. Repeat:ACAAGTCAAGG, Size: 11, Start Positioins:7969, 9299
  13. Repeat:CCTGTTTACC, Size: 10, Start Positioins:2056, 3714
  14. Repeat:TGAGCATATA, Size: 10, Start Positioins:6182, 7983
  15. Repeat:GCATAAAGAG, Size: 10, Start Positioins:1518, 3322
  16. Repeat:AGAAGGAATC, Size: 10, Start Positioins:5744, 7817
  17. Repeat:CCGGCCGTCA, Size: 10, Start Positioins:2697, 4773
  18. Repeat:AGACTCAACT, Size: 10, Start Positioins:5283, 8031
  19. Repeat:GATCGGTGGA, Size: 10, Start Positioins:25, 3005
  20. Repeat:GGTCCTGATAGCG, Size: 13, Start Positioins:1044, 4279
  21. Repeat:GTAAGTGTTT, Size: 10, Start Positioins:540, 3976
  22. Repeat:GTAAGCTAGG, Size: 10, Start Positioins:4008, 7636
  23. Repeat:GTTTCAGATT, Size: 10, Start Positioins:3509, 7617
  24. Repeat:AGATCGCCAC, Size: 10, Start Positioins:2382, 6775
  25. Repeat:CCGCAGCGCA, Size: 10, Start Positioins:1121, 5636
  26. Repeat:CGATTGGAAT, Size: 10, Start Positioins:1602, 6167
  27. Repeat:CACTCATGTA, Size: 10, Start Positioins:821, 5531
  28. Repeat:CTCGGATAGC, Size: 10, Start Positioins:2709, 9155
  29. Repeat:CTCGAGCCAG, Size: 10, Start Positioins:1467, 8255
  30. Repeat:ATTGCGACGA, Size: 10, Start Positioins:1265, 8589
  31. Repeat:GAAGTGGGCG, Size: 10, Start Positioins:1848, 9573
  32. Repeat:TTAATGCAAA, Size: 10, Start Positioins:1748, 9597
  33. Repeat:CGTGATTCTG, Size: 10, Start Positioins:89, 8530
  34. Repeat:TGCCTGTATG, Size: 10, Start Positioins:961, 9957

  35. Inverted Repeat:
  36. Repeat:ACCTTCCTTGACT, Size: 13, Start Positioins:3226, 6709
  37. Repeat:AACCTCGATTGG, Size: 12, Start Positioins:599, 9117
  38. Repeat:ATCGGAAGTC, Size: 10, Start Positioins:3140, 6039
  39. Repeat:TAGAGGTTGC, Size: 10, Start Positioins:4228, 4520
  40. Repeat:GGTACAATGC, Size: 10, Start Positioins:1698, 6789
  41. Repeat:GATGGCTCTGG, Size: 11, Start Positioins:3467, 4314
  42. Repeat:TTTCAGATTG, Size: 10, Start Positioins:3510, 3857
  43. Repeat:GTTGCCGATG, Size: 10, Start Positioins:2671, 4515
  44. Repeat:TAAATGTAGACC, Size: 12, Start Positioins:1072, 5938
  45. Repeat:GCCGCGGCAG, Size: 10, Start Positioins:2588, 4366
  46. Repeat:GCGTCTCCTT, Size: 10, Start Positioins:2871, 4048
  47. Repeat:CGGATTAGGAC, Size: 11, Start Positioins:1624, 5157
  48. Repeat:TGAATGTCTTAC, Size: 12, Start Positioins:2631, 3970
  49. Repeat:TGGATTTGAT, Size: 10, Start Positioins:438, 5949
  50. Repeat:GCGTGATTCTGC, Size: 12, Start Positioins:88, 6202
  51. Repeat:GGCTTATTAGCG, Size: 12, Start Positioins:1614, 4549
  52. Repeat:TGGGATCGAA, Size: 10, Start Positioins:1921, 4010
  53. Repeat:ATAGGAACCT, Size: 10, Start Positioins:2948, 2961
  54. Repeat:GACAATGGTC, Size: 10, Start Positioins:223, 5337
  55. Repeat:GTCGCGTGATT, Size: 11, Start Positioins:85, 5420
  56. Repeat:ACGTGGACTCG, Size: 11, Start Positioins:1530, 3932
  57. Repeat:CCAGAGAGAGG, Size: 11, Start Positioins:628, 3821
  58. Repeat:ATGGTAGGCTT, Size: 11, Start Positioins:104, 4258
  59. Repeat:TAATTCTAAC, Size: 10, Start Positioins:1652, 2338
  60. Repeat:TACTTAGCCAA, Size: 11, Start Positioins:1158, 2243
  61. Repeat:TCGACAGTAA, Size: 10, Start Positioins:565, 2138
  62. Repeat:ATGTCCGTGG, Size: 10, Start Positioins:509, 959
  63. Repeat:TAGGCTTAAA, Size: 10, Start Positioins:108, 1282

  64. real    0m1.382s
  65. user    0m0.010s
  66. sys     0m0.020s
复制代码




//我使用同样的数据集,也就是yuxh老大程序中产生的10000个随机字符,用lightspeed老大的程序运行结果如下:
  1. $ time ./1 datafile
  2. ------------------Repeat Match Line# 1 --------------------

  3. Repeat: GGTCCTGATAGCG, Size: 13, Start Positions: 1045,4280
  4. Repeat: CTCTTGTGCTTA, Size: 12, Start Positions: 4219,4992
  5. Repeat: TCGGTATTCAA, Size: 11, Start Positions: 1539,1820
  6. Repeat: AAAACCACTGA, Size: 11, Start Positions: 3878,4743
  7. Repeat: CCCTGAAAAGC, Size: 11, Start Positions: 6396,7681
  8. Repeat: ACAAGTCAAGG, Size: 11, Start Positions: 7970,9300
  9. Repeat: ATTGCGACGA, Size: 10, Start Positions: 1266,8590
  10. Repeat: CTCGAGCCAG, Size: 10, Start Positions: 1468,8256
  11. Repeat: GCATAAAGAG, Size: 10, Start Positions: 1519,3323
  12. Repeat: CGATTGGAAT, Size: 10, Start Positions: 1603,6168
  13. Repeat: TTAATGCAAA, Size: 10, Start Positions: 1749,9598
  14. Repeat: CCACGCTGAT, Size: 10, Start Positions: 1761,2066
  15. Repeat: GAAGTGGGCG, Size: 10, Start Positions: 1849,9574
  16. Repeat: AGATCGCCAC, Size: 10, Start Positions: 2383,6776
  17. Repeat: CCGGCCGTCA, Size: 10, Start Positions: 2698,4774
  18. Repeat: CTCGGATAGC, Size: 10, Start Positions: 2710,9156
  19. Repeat: AGACTTTACC, Size: 10, Start Positions: 3305,3861
  20. Repeat: GTTTCAGATT, Size: 10, Start Positions: 3510,7618
  21. Repeat: GTAAGCTAGG, Size: 10, Start Positions: 4009,7637
  22. Repeat: TAGACGGCGC, Size: 10, Start Positions: 4365,5497
  23. Repeat: AGACTCAACT, Size: 10, Start Positions: 5284,8032
  24. Repeat: TGATATATCA, Size: 10, Start Positions: 5524,5589
  25. Repeat: AGAAGGAATC, Size: 10, Start Positions: 5745,7818
  26. Repeat: TGAGCATATA, Size: 10, Start Positions: 6183,7984

  27. real    0m14.341s
  28. user    0m14.140s
  29. sys     0m0.050s
复制代码


//不得不佩服两位老大结果一样,呵呵,只是yuxh老大的位置计算的前了一位。不过时间上可是C明显要快,尤其当数据集大的时候。
//不过,还是不明白,为什么重复的片段大多集中在10-13呢,连14都很少见,奇怪。

论坛徽章:
0
44 [报告]
发表于 2004-12-17 19:22 |只看该作者

两道题,问了N多人,没结果,再问一下看看

详细的情况请见:
http://bbs.chinaunix.net/forum/viewtopic.php?p=3094185#3094185

论坛徽章:
0
45 [报告]
发表于 2004-12-17 22:31 |只看该作者

两道题,问了N多人,没结果,再问一下看看

用 C 果真快很多。 但如果你从文件读数据, 应该会慢一点点。
另外, awk 的串操作较慢, 我准备放弃 substr  语句, 相信
会有大的改善。

论坛徽章:
0
46 [报告]
发表于 2004-12-18 10:19 |只看该作者

两道题,问了N多人,没结果,再问一下看看

两位老大好强呀,仔细研读二位的代码,学点东东

论坛徽章:
0
47 [报告]
发表于 2004-12-18 11:43 |只看该作者

两道题,问了N多人,没结果,再问一下看看

挑毛病的来了,咳咳,
yuxh在程序里用了

  1. GenQueue:
  2.     nQueueSize = rand() % MAXSIZE;

  3.     nQueueSize = MAXSIZE; //??好像是yuxh没注意,多加上去的。

  4. main:

  5. printf("String:\n%s\n", strQueue);
复制代码
这个造成了对内存的非法读取。

  1.                     nFlag = 0;
  2.                     nPosition = 0;
  3.                     nMatchLen = 0;
  4.                     hGeneFlag=0;//yuxh在这里忘记加上这一句了。
复制代码

白璧微瑕,瑕不掩瑜。各位继续。

论坛徽章:
0
48 [报告]
发表于 2004-12-18 22:18 |只看该作者

两道题,问了N多人,没结果,再问一下看看

应该用hash最方便而且可靠吧?

论坛徽章:
0
49 [报告]
发表于 2004-12-19 00:31 |只看该作者

两道题,问了N多人,没结果,再问一下看看

原帖由 "lightspeed" 发表:
用 C 果真快很多。 但如果你从文件读数据, 应该会慢一点点。
另外, awk 的串操作较慢, 我准备放弃 substr  语句, 相信
会有大的改善。


等我有空把数据放到你的awk程序里试试,可能快一点,呵呵。

论坛徽章:
0
50 [报告]
发表于 2004-12-19 01:14 |只看该作者

两道题,问了N多人,没结果,再问一下看看

[quote]原帖由 "资深菜鸟"]应该用hash最方便而且可靠吧?[/quote 发表:


老兄是perl方面的高手吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP