【发布时间】:2017-07-30 00:03:48
【问题描述】:
我目前正在寻找一种在 C# 中实现部分单词模式算法的方法。我现在的情况如下:
我有一个用于搜索模式的文本字段。每次用户在此字段中输入或删除字符时,都会触发一个事件,该事件会重新运行搜索算法。所以如果我想在字符串中搜索“face”这个词,比如
“Facebook”、“Facelifting”、““Faceless Face”(无论应该是什么)或一般任何现实生活中的句子作为字符串,
在字段中键入“f”时,算法将首先开始运行。然后它在字符串所在的列表顶部显示最相关的字符串。第二次在键入“fa”时运行,列表再次排序。这种情况一直持续到在文本字段中完全输入“face”并且再次对列表进行排序。
但是我不知道可以使用什么算法。我尝试了 Alain (Getting the closest string match) 的答案,一个简单的 Levenshtein-Distance 算法以及一个自制算法,通过
计算优先级priority = (length_of_typed_pattern) * (amount_of_substr_matches)
在 C# 中,后者如下所示:
count = Regex.Matches(Regex.Escape(title), pattern).Count;
priority = pattern.Length * count;
模式和标题仅由小写字母组成。 到目前为止我的结论:
- 汉明距离没有任何意义,因为大多数时候字符串的长度不同
- Alain 的答案可以正常工作,但前提是至少有一个词完全匹配(只有当至少一个词与模式相等时,您才会找到最相关的字符串/句子,所以如果您输入了“face”并且有一个包含单词“facebook”的字符串,包含“facebook”的字符串几乎从来都不是首要任务
我还可以尝试哪些其他想法?目标是尽可能早地对字符串列表进行排序(使用最少的字母)。
您可以在我的存储库的 http://github.com/croemheld/sprung 上的 search-* 分支中查看我的实现,位于 Sprung/WindowMatcher.cs 和 Sprung/Window.cs。
感谢您的帮助。
【问题讨论】:
标签: c# string algorithm pattern-matching