如果您对使用Rabin-Karp搜索字符串中的多个模式和bing的搜索字符串感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解使用Rabin-Karp搜索字符串中的多个模式的各种细节,并对bing
如果您对使用Rabin-Karp搜索字符串中的多个模式和bing的搜索字符串感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解使用Rabin-Karp搜索字符串中的多个模式的各种细节,并对bing的搜索字符串进行深入的分析,此外还有关于.Net使用什么算法搜索字符串中的模式?、c# – 将搜索字符串转换为FullText兼容的搜索字符串?、JS对string正则处理,并返回匹配结果.array[0]为原字符串,array[i]为匹配在整个被搜索字符串中的位置、Oracle函数(字符串中搜索字符位置(全角算1字符))的实用技巧。
本文目录一览:- 使用Rabin-Karp搜索字符串中的多个模式(bing的搜索字符串)
- .Net使用什么算法搜索字符串中的模式?
- c# – 将搜索字符串转换为FullText兼容的搜索字符串?
- JS对string正则处理,并返回匹配结果.array[0]为原字符串,array[i]为匹配在整个被搜索字符串中的位置
- Oracle函数(字符串中搜索字符位置(全角算1字符))
使用Rabin-Karp搜索字符串中的多个模式(bing的搜索字符串)
根据Wikipedia关于Rabin-
Karp字符串匹配算法的条目,它可以用于同时查找字符串中的几种不同模式,同时仍保持线性复杂度。显然,当所有模式的长度相同时,很容易做到这一点,但是当同时搜索具有不同长度的模式时,我仍然不知道如何保持O(n)复杂性。有人可以说明一下吗?
修改(2011年12月):
此后,维基百科文章已更新,不再声明匹配O(n)中长度不同的多个模式。
答案1
小编典典我不确定这是否是正确的答案,但是无论如何:
在构造 哈希值时,我们可以检查字符串哈希集中是否匹配。又名, 当前 哈希值。哈希函数/代码通常实现为一个循环,在该循环内,我们可以插入快速查找。
当然,我们必须m
从字符串集中选择最大字符串长度。
更新: 从Wikipedia,
[...]for i from 1 to n-m+1 if hs ∈ hsubs if s[i..i+m-1] = a substring with hash hs return i hs := hash(s[i+1..i+m]) // <---- calculating current hash[...]
我们分步计算 当前 哈希值m
。每一步都有一个 临时
哈希值,我们可以在哈希集合中查找(O(1)complexity)。所有哈希将具有相同的大小,即32位。
更新2: 摊销(平均)O(n)时间复杂度?
上面我说过m
必须有最大的字符串长度。事实证明,我们可以利用相反的东西。
通过使用散列来移动子字符串搜索并使用固定m
大小的哈希,我们可以实现O(n)复杂度。
如果我们有可变长度的字符串,我们可以设置m
为最小字符串长度。此外,在哈希集合中,我们不将哈希与整个字符串关联,而是与哈希的前m个字符关联。
现在,在搜索文本时,我们检查当前哈希是否在哈希集中,并检查关联的字符串是否匹配。
此技术将增加虚假警报,但平均而言,它具有O(n)时间复杂度。
.Net使用什么算法搜索字符串中的模式?
我现在正在研究字符串搜索算法,并且想知道.NET String使用哪种算法。例如包含函数。Reflector显示使用了此功能,但我不知道它的名称是什么意思。
private static extern int InternalFindNLSStringEx(IntPtr handle, string localeName, int flags, string source, int sourceCount, int startIndex, string target, int targetCount);
答案1
小编典典这只是通过在文本和模式上使用O(n·m)运行时的嵌套循环进行的简单字符串搜索实现。
特别是,MSDN没有指定此方法的性能,因此假设性能更好是不安全的。
此外,最先进的模式搜索方法是相当专业的某些字符串类型,虽然有 有 更好的通用搜索算法,在实现一个String.IndexOf
有点不必要的优化。
原因很简单:如果您 需要 有效的模式搜索,那么无论如何都将实现自己的,定制的以适合您的特定数据。因此,无需在通用库中实现任何花哨的功能。
截至2016年(现已提供Core
CLR源代码),该实现仍在使用幼稚的嵌套循环。这是在NewApis::IndexOfString
和中实现的,并NewApis::FastIndexOfString
通过InternalFindNLSStringEx
被管理String.Contains
和String.IndexOf
函数调用(通过)。
c# – 将搜索字符串转换为FullText兼容的搜索字符串?
("keyword1" AND "keyword2*" OR "keyword3")
我的用户输入的内容如下:
engine 2009 "san francisco" hotel december xyz stuff* "in miami" 1234 something or "something else"
我正在尝试将这些转换为全文引擎兼容的字符串,如下所示:
("engine" AND "2009") ("san francisco" AND "hotel" AND "december" AND "xyz") ("stuff*" "in miami" "1234") ("something" OR "something else")
我有一个非常困难的时间,尝试使用计数引号,空格和插入等,但我的代码看起来像可怕的呕吐物.
有人可以帮忙吗?
解决方法
class Program { static void Main(string[] args) { // setup some test expressions List<string> searchExpressions = new List<string>(new string[] { "engine 2009","\"san francisco\" hotel december xyz","stuff* \"in miami\" 1234 ","something or \"something else\"" }); // display and parse each expression foreach (string searchExpression in searchExpressions) { Console.WriteLine(string.Concat( "User Input: ",searchExpression,"\r\n\tsql Expression: ",ParseSearchExpression(searchExpression),"\r\n")); } Console.ReadLine(); } private static string ParseSearchExpression(string searchExpression) { // replace all 'spacecharacters' that exists within quotes with character 0 string temp = Regex.Replace(searchExpression,@"""[^""]+""",(MatchEvaluator)delegate(Match m) { return Regex.Replace(m.Value,@"[\s]","\x00"); }); // split string on any spacecharacter (thus: quoted items will not be splitted) string[] tokens = Regex.Split(temp,@"[""\s]+",RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture); // generate result StringBuilder result = new StringBuilder(); string tokenLast = string.Empty; foreach (string token in tokens) { if (token.Length > 0) { if ((token.Length > 0) && (!token.Equals("AND",StringComparison.OrdinalIgnoreCase))) { if (result.Length > 0) { result.Append(tokenLast.Equals("OR",StringComparison.OrdinalIgnoreCase) ? " OR " : " AND "); } result.Append("\"").Append(token.Replace("\"","\"\"").Replace("\x00"," ")).Append("\""); } tokenLast = token; } } if (result.Length > 0) { result.Insert(0,"(").Append(")"); } return result.ToString(); } }
JS对string正则处理,并返回匹配结果.array[0]为原字符串,array[i]为匹配在整个被搜索字符串中的位置
JS代码如下:
/**
* 对string进行正则处理,并返回匹配结果.array[0]为原字符串,array[i]为匹配在整个被搜索字符串中的位置。
* @param
* @arrange (小编) jb51.cc
**/
<script type=text/javascript>
var str = i love china!;
var reg = /i\B/g;
var ret = reg.exec(str);
alert(ret); // i
console.log(ret); //[i,index: 9,input: i love china!]
</script>
Oracle函数(字符串中搜索字符位置(全角算1字符))
Oracle函数(字符串中搜索字符位置(全角算1字符))INSTR(C1,C2[,I[,J]])【功能】在一个字符串中搜索指定的字符,返回发现指定的字符
Oracle函数(字符串中搜索字符位置(全角算1字符))
INSTR(C1,C2[,I[,J]])
【功能】在一个字符串中搜索指定的字符,返回发现指定的字符的位置;
【说明】多字节符(汉字、全角符等),按1个字符计算
【参数】C1 被搜索的字符串C2 希望搜索的字符串I 搜索的开始位置,默认为1J 第J次出现的位置,默认为1
【返回】数值
【示例】select instr(''
【示例】select instr(''重庆某软件公司'',''某'',1,1),instrb(''重庆某软件公司'',''某'',1,1) instring from dual;
返回:3,5
我们今天的关于使用Rabin-Karp搜索字符串中的多个模式和bing的搜索字符串的分享就到这里,谢谢您的阅读,如果想了解更多关于.Net使用什么算法搜索字符串中的模式?、c# – 将搜索字符串转换为FullText兼容的搜索字符串?、JS对string正则处理,并返回匹配结果.array[0]为原字符串,array[i]为匹配在整个被搜索字符串中的位置、Oracle函数(字符串中搜索字符位置(全角算1字符))的相关信息,可以在本站进行搜索。
本文标签: