免费注册 查看新帖 |

Chinaunix

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

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

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

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

需要那么多吗?不觉得,明天写出来,但测试到底是否完全正确就不知道有什么办法了.

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

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

原帖由 "THEBEST" 发表:
to aero:
这个程序似乎不符合要求,楼主是要随机产生一个10000长度的字符串,然后自动查找所有同一样的字符串的开始位置.我想了一下,觉得处理起来不难(只是一些细节容易出错),但效率嘛....


呵呵,我的字符串的长度也是随机的了<100。要是固定10000长度的,其实更好生成。不过,作业题至于嘛?而且,怎么往屏幕上打啊?

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

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

写了一下,但还有问题,随机生成的全是一样的字符呢?当然这样情况并不是不能存在,总的讲,程序还有是问题,只是一个思路而矣.
  1. #include <iostream>;
  2. #include <fstream>;
  3. #include <string>;
  4. #include <vector>;
  5. #include <map>;
  6. #include <set>;
  7. #include <ctime>;
  8. #include <cstdlib>;
  9. #include <algorithm>;
  10. #include <exception>;
  11. using namespace std;

  12. const int SizeMax=10000;
  13. char RandChar();
  14. void RandString(string &s);
  15. void OutputStatics(ofstream &out,
  16.                  const string &s,const map<string,vector<int>; >; &sameStr);
  17. void FindSameStr(const string &s, string::size_type minLen = 10);
  18. void FindSameReverseStr(const string &s,string::size_type minLen = 10);

  19. int main()
  20. {
  21.    ofstream test("C:\\test.txt");
  22.    string testString;
  23.    RandString(testString);
  24.    test << testString << endl;
  25.    FindSameStr(testString);
  26. //  FindSameReverseStr(testString);   
  27.    cin.get();
  28. }

  29. char RandChar()
  30. {
  31.     srand(time(0));
  32.     switch(rand()%4)
  33.     {
  34.        case 0: return 'A';
  35.                break;
  36.        case 1: return 'C';
  37.                break;
  38.        case 2: return 'G';
  39.                break;
  40.        case 3: return 'T';
  41.                break;
  42.        default:
  43.               cout << "Error and Exit Prog\n" << endl;
  44.               exit(-1);
  45.     }
  46. }           

  47. void RandString(string &s) {
  48.       for (int i=0; i<SizeMax; ++i)
  49.       s.push_back(RandChar());
  50. }
  51.       
  52. void OutputStatics(ofstream &out,
  53.                  const string &s,const map<string,vector<int>; >; &sameStr)
  54. {
  55.      out << "Source String:\n" << s << "\n\n" << endl;
  56.      map<string,vector<int>; >;::const_iterator iter = sameStr.begin();
  57.      out << "The Same String in the Source String:\n" << endl;
  58.      while (iter != sameStr.end())
  59.      {
  60.          out << iter->;first << "   Length:  " << (iter->;first).size() << endl
  61.              << "The Start Pos:  ";
  62.          for (vector<int>;::const_iterator vi = (iter->;second).begin();
  63.                         vi != (iter->;second).end(); ++vi)
  64.              out << *vi << "  ";
  65.          out << endl;
  66.      }
  67. }
  68.         
  69. void FindSameStr(const string &s, string::size_type minLen)
  70. {
  71.     string::size_type idx = 0, maxLen = minLen, pos = 0;
  72.     map<string,vector<int>; >; mvs;
  73.     set<string>; SetStr;
  74.     string tempFound, moreLenFound, Found;
  75.    
  76. while (1)   //重要:前面的字符串没有同样的时候还需要找后面的,直到最后一个可能的字符串
  77. {
  78.     tempFound = string(s,idx,minLen);
  79.     //只要能找到一个同样的就行   
  80.     while ( (s.find(tempFound,idx+tempFound.length())) != string::npos)
  81.     {
  82.         Found = moreLenFound = tempFound;
  83.         //是否存在更长的同样的字符串
  84.         while (1)
  85.         {
  86.               moreLenFound.push_back(s[idx + maxLen++ - 1]);
  87.               //再也找不到更长的字符串了
  88.               if (s.find(moreLenFound,idx + maxLen) == string::npos)
  89.               {
  90.                   SetStr.insert(Found);
  91.                   idx += (maxLen - minLen);
  92.                   maxLen = minLen;
  93.                   break;
  94.               }
  95.               Found = moreLenFound;  //保存最长同样的字符串
  96.         }
  97.     }
  98. if ( (++idx + minLen) == SizeMax )
  99.    break;
  100. }   
  101.      //处理SetStr中的字符串,找到所有共同的字符串的起点
  102.      for (set<string>;::iterator iter = SetStr.begin(); iter != SetStr.end(); ++iter)
  103.      {
  104.          pos = 0;
  105.          while( (pos = s.find(*iter),pos) != string::npos)
  106.          {
  107.              mvs[*iter].push_back(pos);
  108.              pos += (*iter).size();
  109.          }
  110.      }
  111.      ofstream coutstr("C:\\sourceStr.txt");   
  112.      OutputStatics(coutstr,s,mvs);   //可以直接输出到cout上
  113. }            

  114. void FindSameReverseStr(const string &s,string::size_type minLen)
  115. {
  116.      //在适当的地方把被查找字符串反转一下,和上面的一样处理,也可以来个bool参数
  117. }
复制代码

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

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

楼主,还没看你发的那个就写了一下,效率很低.

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

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

我不认为以上2位的程序已经完美,楼主的意见呢

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

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

[quote]原帖由 "eagerly1"]我不认为以上2位的程序已经完美,楼主的意见呢[/quote 发表:

我说了我的程序是有错的 更谈不上完美. 明天再改改.

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

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

原帖由 "THEBEST" 发表:

我说了我的程序是有错的 更谈不上完美. 明天再改改.

虽然我写不出这样的程序,但我愿意在这里看到详细而深入的讨论.
学习大家,包括你的敬业精神.

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

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

[quote]原帖由 "eagerly1"]我不认为以上2位的程序已经完美,楼主的意见呢[/quote 发表:


我个人认为已经很不错了,只是这两个题主要是考算法而不是语法,所以我个人认为如果不搞算法的人能做到这样已经很不容易了,至少我根本达不到这种高度。

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

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

程序终于调试好了,但存在一些必需说明的问题:
1>;我机子性能不好,产生10000长度也不知道结果到底是否正确.
2>;我用10位最大长度及至少4位一样长度的相等的字符串试了结果是正确的.
3>;希望帮忙测试一下.
4>;
  1. 2 C:\ProTemp\FindSameStr.cpp:128 [Warning] no newline at end of file
复制代码
这个问题到底是什么引起的?如何解决.好像运气不好就会有,看到有警告不爽.
5>;程序效率很低,还可以改进很多.但需要时间.
6>;为什么随机数都是一样的?程序哪里错了,在产生随机数上.
7>;代码如下:
  1. #include <iostream>;
  2. #include <fstream>;
  3. #include <string>;
  4. #include <vector>;
  5. #include <map>;
  6. #include <set>;
  7. #include <ctime>;
  8. #include <cstdlib>;
  9. #include <algorithm>;
  10. #include <exception>;
  11. using namespace std;

  12. const int SizeMax=1000;   //测试时改成自己想要的最大长度原串
  13. char RandChar();
  14. void RandString(string &s);
  15. void OutputStatics(ofstream &out,
  16.                  const string &s,const map<string,vector<int>; >; &sameStr);
  17. void FindSameStr(const string &s, string::size_type minLen = 10);
  18. void FindSameReverseStr(const string &s,string::size_type minLen = 10);

  19. int main()
  20. {
  21.    ofstream test("C:\\test.txt");
  22.    string testString;
  23.    RandString(testString);
  24.    test << testString << endl;
  25.    FindSameStr(testString);  //测试时改成最小同样串长度,默认是10
  26. //  FindSameReverseStr(testString);   
  27.    cin.get();
  28. }

  29. char RandChar()
  30. {
  31.     srand(time(0));
  32.     switch(rand()%4)
  33.     {
  34.        case 0: return 'A';
  35.                break;
  36.        case 1: return 'C';
  37.                break;
  38.        case 2: return 'G';
  39.                break;
  40.        case 3: return 'T';
  41.                break;
  42.        default:
  43.               cout << "Error and Exit Prog\n" << endl;
  44.               exit(-1);
  45.     }
  46. }           

  47. void RandString(string &s) {
  48.       for (int i=0; i<SizeMax; ++i)
  49.       s.push_back(RandChar());
  50. }
  51.       
  52. void OutputStatics(ofstream &out,
  53.                  const string &s,const map<string,vector<int>; >; &sameStr)
  54. {
  55.      out << "Source String:\n" << s << "\n\n" << endl;
  56.      map<string,vector<int>; >;::const_iterator iter = sameStr.begin(),
  57.                                               iter_end = sameStr.end();
  58.      out << "The Same String in the Source String:\n" << endl;
  59.      while ( iter != iter_end)
  60.      {
  61.          out << iter->;first << "   Length:  " << (iter->;first).size() << endl
  62.              << "The Start Pos:  ";
  63.          for (vector<int>;::const_iterator vi = (iter->;second).begin();
  64.                         vi != (iter->;second).end(); ++vi)
  65.              out << *vi << "  ";
  66.          out << endl << endl;
  67.          ++iter;
  68.      }
  69. }
  70.         
  71. void FindSameStr(const string &s, string::size_type minLen)
  72. {
  73.     string::size_type idx = 0, maxLen = minLen, pos = 0;
  74.     map<string,vector<int>; >; mvs;
  75.     set<string>; SetStr;
  76.     string tempFound, moreLenFound, Found;
  77.    
  78. while (1)   //重要:前面的字符串没有同样的时候还需要找后面的,直到最后一个可能的字符串
  79. {
  80.     tempFound = string(s,idx,minLen);
  81.     //只要能找到一个同样的就行,注意是从该被找字符串之后开始找  
  82.     while ( (s.find(tempFound,idx+tempFound.length())) != string::npos)
  83.     {
  84.         Found = moreLenFound = tempFound;
  85.         //是否存在更长的同样的字符串
  86.         while (1)
  87.         {
  88.               moreLenFound.push_back(s[idx + maxLen++ - 1]);
  89.               //再也找不到更长的字符串了
  90.               if (s.find(moreLenFound,idx + maxLen) == string::npos)
  91.               {
  92.                   SetStr.insert(Found);
  93.                   idx += (maxLen - minLen);
  94.                   maxLen = minLen;
  95.                   tempFound = string(s,idx,minLen);  //构造好下一个被找字符串
  96.                   break;
  97.               }
  98.               Found = moreLenFound;  //保存最长同样的字符串
  99.         }        
  100.     }

  101. if ( (++idx + 2*minLen) >; SizeMax )
  102.    break;
  103. }   
  104.      //处理SetStr中的字符串,找到所有共同的字符串的起点
  105.      for (set<string>;::iterator iter = SetStr.begin(); iter != SetStr.end(); ++iter)
  106.      {
  107.          pos = 0;
  108.          while( (pos = s.find(*iter,pos)) != string::npos)
  109.          {
  110.              mvs[*iter].push_back(pos);
  111.              pos += (*iter).size();
  112.              if(pos >;= SizeMax)
  113.                  break;
  114.          }
  115.      }
  116.      ofstream coutstr("C:\\sourceStr.txt");   
  117.      OutputStatics(coutstr,s,mvs);   //可以直接输出到cout上
  118. }            

  119. void FindSameReverseStr(const string &s,string::size_type minLen)
  120. {
  121.      //在适当的地方把被查找字符串反转一下,和上面的一样处理,也可以来个bool参数
  122. }
复制代码

下面的我用的10,4测试后的结果:
Source String:
AAAAAAAAAA


The Same String in the Source String:

AAAA   Length:  4
The Start Pos:  0  4  

AAAAA   Length:  5
The Start Pos:  0  5  

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

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

原帖由 "bioinfor" 发表:

我个人认为已经很不错了,只是这两个题主要是考算法而不是语法,所以我个人认为如果不搞算法的人能做到这样已经很不容易了,至少我根本达不到这种高度。
如果光是学语法我觉得没多大意思.我觉得关键还是看如何解决问题,一种用某种语言来解决实际问题的思路,但这题有很多需要考虑的细节,我一开始也没想到,调试程序时发现很多地方需要控制.个人看法.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP