我有两个字符串包含由空格分隔的字母和数字。 ex “elza7ma wa2fa fel matab”and“2ana ba7eb el za7ma 2awy 2awy”C#比较匹配单词的两个字符串
比较这两个字符串以找出它们是否有共同词汇的最快方法是什么?
我试图用string.split拆分其中的一个,并在整个单词数组上使用string.compare。但是由于我会比较很多字符串,所以速度很慢。
我有两个字符串包含由空格分隔的字母和数字。 ex “elza7ma wa2fa fel matab”and“2ana ba7eb el za7ma 2awy 2awy”C#比较匹配单词的两个字符串
比较这两个字符串以找出它们是否有共同词汇的最快方法是什么?
我试图用string.split拆分其中的一个,并在整个单词数组上使用string.compare。但是由于我会比较很多字符串,所以速度很慢。
LINQ的解决方案
"elza7ma wa2fa fel matab".Split()
.Intersect("2ana ba7eb el za7ma 2awy 2awy".Split())
.Any();
// as a string extension method
public static class StringExtensions
{
public static bool OneWordMatches(this string theString, string otherString)
{
return theString.Split().Intersect(otherString.Split()).Any();
}
}
// returns true
"elza7ma wa2fa fel matab 2ana".OneWordMatches("2ana ba7eb el za7ma 2awy 2awy");
我认为最简单的方法是将字符串分解成字和使用像HashSet<string>
一组结构,重复检查。例如,
public bool HasMatchingWord(string left, string right) {
var hashSet = new HashSet<string>(
left.Split(" ", StringSplitOptions.RemoveEmptyEntries));
return right
.Split(" ", StringSplitOptions.RemoveEmptyEntries)
.Any(x => hashSet.Contains(x));
}
可能还想添加一个相等检查来处理冲突(如果有的话)。 – 2010-09-24 08:18:19
是否有人确定如果这是最好的方法性能明智? – Marwan 2010-09-24 08:49:40
您可以通过单词拆分这两个字符串并构建两个哈希表/字典。然后通过两者并在第三个字典中添加递增int的键(Dictionary<string, int>
)。如果第三个字典中的任何一个键的计数不止一个,那么这个词就是两个原始字符串。
我会认为解决这个问题的任何算法都会很慢 - 特别是对于大量的输入字符串/许多单词。
我可能会采取最初的性能命中并拆分字符串,然后按字母顺序和字长进行排序。 如果您只需查明一个单词是否匹配,只要找到一个单词就会中断。 一旦你有字母和长度的字母顺序拆分字符串数组,这限制了你必须做的比较次数。
看来indexOf会比正则表达式工作得更快,但不知道它是否更快,然后string.compare :)。你可以尝试 – Danil 2010-09-24 07:45:28
你真的想*最快*吗?你可以在那个问题上工作几年*。我怀疑你想*速度够快,在这种情况下,你没有提供足够的信息来解决问题。 *什么是您的硬件,什么是您的时间预算,什么是典型的大小问题?* – 2010-09-24 15:29:29
另外,什么是“很多字符串”?下面的评论表明“很多”是数百。我会认为数百个是*数量极少的字符串*。这是否准确?我认为“很多”是数百万或数十亿字符串 - 如Bing所示,索引的字符串很多。如果不清楚问题的大小,很难给出一个很好的答案。 – 2010-09-24 16:05:46