首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

高人,来个算法.进来瞧瞧解决方案

2012-01-30 
高人,来个算法.进来瞧瞧程序需求如下:判断一个文本文件中,某一字符串存在的个数.(文本文件体积,超过10M)比

高人,来个算法.进来瞧瞧
程序需求如下:
判断一个文本文件中,某一字符串存在的个数.(文本文件体积,超过10M)
比如判断文本文件a.txt中,字符串"ul"在此文本文件中的个数.我写了下面两个算法.
  private static void A1(string str, string str1)
  {
  DateTime d1 = DateTime.Now;
  int pos = 0;
  int total = -1;
  while (pos != -1)
  {
  pos = str.IndexOf(str1, pos+1);
  total++;
  }
  TimeSpan t = DateTime.Now - d1;
  System.Console.WriteLine("共有{0}个匹配字符串,耗时{1}毫秒", total, t.TotalMilliseconds);


  }
  private static void A3(string str, string str1)
  {
  DateTime d1 = DateTime.Now;
  int total = 0;
  System.Text.RegularExpressions.MatchCollection mc = System.Text.RegularExpressions.Regex.Matches(str, str1);
  total = mc.Count;
  TimeSpan t = DateTime.Now - d1;
  System.Console.WriteLine("共有{0}个匹配字符串,耗时{1}毫秒", total, t.TotalMilliseconds);
  }

第二个算法,在性能上,要优于第一个算法,可是,还不太理想,有没有更快的算法?如果有,请附上源代码.

[解决办法]
把文件一次读到一个string中吗?载入文件分配内存也是很耗时间的
计算时间要把载入的部分也计算上先
[解决办法]
对方法2的改进:
Regex regex = new Regex(regexstr, RegexOptions.Compiled);
mc = regex.Match(inputstr);
如果要做的数据量很大,或者是一个正则被重复的使用则可以采用编译型的正则

另外关于楼主时间的采样方法是不精确的。OS是多任务的,关于你代码的运行时间应该取
TimeSpan beginTime = System.Diagnostics.Process.GetCurrentProcess().TotalProcessorTime;
//这里跑算法
TimeSpan endTime = System.Diagnostics.Process.GetCurrentProcess().TotalProcessorTime;
TimeSpan totalTime = endTime.Subtract(beginTime);
如果程序运行的时间很短是误差很大的
[解决办法]

C# code
楼主可以先将文本文件读入一个字符串中,然后判断一个字符串在另外一个字符串中的个数的方法很多:1、string str1='ul';   string str2='ulasdulauldsduls';   string[] st=s.Split(str1.ToCharArray());    int n=st.Length-1; //2.string str1='ul';  string str2='ulasdulauldsduls';  int n=str2.length-str2.Replace(str1,'').length;等等还有很多。。 

热点排行