微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

什么是最有效(读取时间)字符串搜索方法? (C#)

我发现我的程序正在搜索许多冗长的字符串(20,000),试图找到一个特定的独特短语.

在C#中执行此操作的最有效方法是什么?

下面是当前的代码,它的工作原理如下:

>搜索从startPos开始,因为目标区域从一开始就有所消除
>它循环遍历字符串,在每一步它检查该点的子字符串是否以startMatchString开头,这是指示已找到目标字符串的开头. (目标字符串varys的长度).
>从这里创建一个新的子串(切掉标记目标字符串开头的11个字符)并搜索endMatchString

我已经知道这是一个非常复杂且可能非常无效的算法.
有什么更好的方法来实现相同的结果?

string result = string.Empty;    
for (int i = startPos; i <= response.Length - 1; i++)
{
   if (response.Substring(i).StartsWith(startMatchString))
   {
       string result = response.Substring(i).Substring(11);
       for (int j = 0; j <= result.Length - 1; j++)
       {
           if (result.Substring(j).StartsWith(endMatchString))
           {
               return result.Remove(j)
           }
       }
   }
}
return result;

解决方法

您可以使用String.IndexOf,但请确保使用StringComparison.Ordinal,否则可能会慢一个数量级.

private string Search2(int startPos,string startMatchString,string endMatchString,string response) {
    int startmarch = response.IndexOf(startMatchString,startPos,StringComparison.Ordinal);
    if (startmarch != -1) {
        startmarch += startMatchString.Length;
        int endMatch = response.IndexOf(endMatchString,startmarch,StringComparison.Ordinal);
        if (endMatch != -1) { return response.Substring(startmarch,endMatch - startmarch); }
    }
    return string.Empty;
}

在大约183 KB文件的40%处搜索1000次字符串大约需要270毫秒.没有StringComparison.Ordinal,它花了大约2000毫秒.使用您的方法搜索一次花费超过60秒,因为它在每次迭代时创建一个新字符串(O(n)),使您的方法为O(n ^ 2).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐