我目前正在寻找一种在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;
模式和标题仅由小写字母组成。 我的结论到目前为止:
我可以尝试其他什么想法?目标是在最早的时刻以最少的方式对字符串列表进行排序(字母最少)。
您可以在Sprung / WindowMatcher.cs和Sprung / Window.cs中查看http://github.com/croemheld/sprung上我的存储库的search- *分支中的实现。
感谢您的帮助。
答案 0 :(得分:0)
首先,您需要在某个地方存储与字符串相关的频率(搜索特定字符串的次数),以便在搜索时显示最相关的频率。如果你需要显示说k最相关的条目,那么可以实现大小为'k'的最小堆。
案例1-如果第一次按下一封信: -
步骤(a)从数据库或字典开始读取所有字符串,并使用FLAG_VALID(最初设置为1)存储在某些数据结构(Say DS1)中,这表明它是当前搜索字符的有效字符串(对于第一个字母,所有字符串都是有效的)。 当你读取字符串时,根据它们的频率填充Min Heap,只有当频率大于最小值时才会插入具有特定频率的元素(即min Heap的第一个元素)。
步骤(b)(此步骤对于显示结果的所有情况都是相同的)要显示结果,您需要以与Min Heap相反的顺序显示元素,即Min Heap中的第一个元素将具有最小优先级,所以基本上我们需要删除所有元素一个接一个地从最后到第一个显示。 注意: - Min Heap将包含对特定字符串的引用,因此可以同时访问字符串及其频率。
案例2-在搜索框中插入下一个字母:
步骤(a)在DS1中搜索所有字符串,并首先检查FLAG_VALID。如果它是一个有效的字符串,则比较搜索框中的字符串和DS1中的字符串。相应地设置标志(如果它是匹配-1或不是-0)并填充k-Min堆,因为它与上一次搜索一样为空,如情况1所示。
步骤(b)与往常一样。
案例3-删除搜索框中的字母:
与上述情况类似,但这次我们需要搜索那些FALG_VALID为0的字符串(即字符串无效)。
这是一种粗略的搜索方法,可以使用某些数据结构进行改进并调整算法。