gpt4 book ai didi

c# - StringBuilder 中最快的搜索方法

转载 作者:可可西里 更新时间:2023-11-01 08:04:09 24 4
gpt4 key购买 nike

我有一个名为 stb_Swap_TabuStringBuilder 用于存储类(class)名称,我正在使用以下方法查找类(class):

stb_Swap_Tabu.ToString.Contains("CourseName")

就我而言,性能是最重要的问题。有没有更快的方法?

最佳答案

StringBuilder 并非真正用于所有字符串目的。如果你真的需要搜索一个,你必须自己写一个方法。

有几种适合不同情况的字符串搜索算法。

以下是 Knuth–Morris–Pratt 算法的一个简单实现,它只关心顺序匹配(没有大小写折叠,没有与文化相关的排序规则,只是代码点到代码点的简单匹配)。它有一些初始的 Θ(m) 开销,其中 m 是所查找单词的长度,然后在 Θ(n) 中找到 code>n 是到所查找单词的距离,如果不存在,则为整个字符串生成器的长度。这击败了简单的逐字符比较,即 Θ((n-m+1) m)(其中 O() 符号描述上限,Θ() 描述了上限和下限)。

综上所述,听起来确实创建列表可能是完成手头任务的更好方法。

public static class StringBuilderSearching
{
public static bool Contains(this StringBuilder haystack, string needle)
{
return haystack.IndexOf(needle) != -1;
}
public static int IndexOf(this StringBuilder haystack, string needle)
{
if(haystack == null || needle == null)
throw new ArgumentNullException();
if(needle.Length == 0)
return 0;//empty strings are everywhere!
if(needle.Length == 1)//can't beat just spinning through for it
{
char c = needle[0];
for(int idx = 0; idx != haystack.Length; ++idx)
if(haystack[idx] == c)
return idx;
return -1;
}
int m = 0;
int i = 0;
int[] T = KMPTable(needle);
while(m + i < haystack.Length)
{
if(needle[i] == haystack[m + i])
{
if(i == needle.Length - 1)
return m == needle.Length ? -1 : m;//match -1 = failure to find conventional in .NET
++i;
}
else
{
m = m + i - T[i];
i = T[i] > -1 ? T[i] : 0;
}
}
return -1;
}
private static int[] KMPTable(string sought)
{
int[] table = new int[sought.Length];
int pos = 2;
int cnd = 0;
table[0] = -1;
table[1] = 0;
while(pos < table.Length)
if(sought[pos - 1] == sought[cnd])
table[pos++] = ++cnd;
else if(cnd > 0)
cnd = table[cnd];
else
table[pos++] = 0;
return table;
}
}

关于c# - StringBuilder 中最快的搜索方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12261344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com