【问题标题】:Search algorithm for partial words in C#C#中部分单词的搜索算法
【发布时间】: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


    【解决方案1】:

    首先,您需要在某个位置存储与字符串相关的频率(搜索特定字符串的次数),以便在搜索时显示最相关的字符串。如果您需要显示 k 个最相关的条目,则可以实现大小为“k”的 Min Heap。

    案例1-如果第一次按下一个字母:-

    步骤 (a) 读取从数据库或字典开始的所有字符串,并存储在一些数据结构中(比如 DS1),带有 FLAG_VALID(最初设置为 1),这表明它是当前搜索字符的有效字符串(对于第一个字母,所有字符串都是有效的)。 当您阅读字符串时,会根据它们的频率填充最小堆,并且只有当其频率大于最小值(即最小堆的第一个元素)时才会插入具有特定频率的元素。

    步骤(b)(此步骤对于所有情况都显示结果相同)要显示结果,您需要以与最小堆相反的顺序显示元素,即最小堆中的第一个元素的优先级最低,所以基本上我们需要删除所有元素一个一个地显示它从最后到第一个。 注意:- Min Heap 将包含对特定字符串的引用,因此可以同时访问该字符串及其频率。

    案例 2- 在搜索框中插入下一个字母:

    步骤 (a) 搜索所有字符串都存在的 DS1,并首先检查 FLAG_VALID。如果它是有效字符串,则比较搜索框中的字符串和 DS1 中的字符串。相应地设置标志(如果它是匹配 1 或非 0)并填充 k-Min 堆,因为它在最后一次搜索中为空,如案例 1。

    步骤 (b) 照常进行。

    案例3-在搜索框中删除一个字母:

    与上述情况类似,但这次我们需要搜索那些 FALG_VALID 为 0 的字符串(即无效的字符串)。

    这是一种粗略的搜索方法,可以使用一定的数据结构和调整算法来改进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      相关资源
      最近更新 更多