GVKun编程网logo

使用Rabin-Karp搜索字符串中的多个模式(bing的搜索字符串)

26

如果您对使用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的搜索字符串)

使用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使用什么算法搜索字符串中的模式?

我现在正在研究字符串搜索算法,并且想知道.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.ContainsString.IndexOf函数调用(通过)。

c# – 将搜索字符串转换为FullText兼容的搜索字符串?

c# – 将搜索字符串转换为FullText兼容的搜索字符串?

我正在使用MSsql 2008的全文搜索引擎,它需要一个像这样的搜索字符串:
("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]为匹配在整个被搜索字符串中的位置

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字符))

Oracle函数(字符串中搜索字符位置(全角算1字符))INSTR(C1,C2[,I[,J]])【功能】在一个字符串中搜索指定的字符,返回发现指定的字符

Oracle函数(字符串中搜索字符位置(全角算1字符))

INSTR(C1,C2[,I[,J]])

【功能】在一个字符串中搜索指定的字符,返回发现指定的字符的位置;

【说明】多字节符(汉字、全角符等),按1个字符计算

【参数】C1 被搜索的字符串C2 希望搜索的字符串I 搜索的开始位置,默认为1J 第J次出现的位置,默认为1

【返回】数值

【示例】select instr(''oracle traning'',''ra'',1,2) instring from dual;返回:9

【示例】select instr(''重庆某软件公司'',''某'',1,1),instrb(''重庆某软件公司'',''某'',1,1) instring from dual;

返回:3,5

linux

我们今天的关于使用Rabin-Karp搜索字符串中的多个模式bing的搜索字符串的分享就到这里,谢谢您的阅读,如果想了解更多关于.Net使用什么算法搜索字符串中的模式?、c# – 将搜索字符串转换为FullText兼容的搜索字符串?、JS对string正则处理,并返回匹配结果.array[0]为原字符串,array[i]为匹配在整个被搜索字符串中的位置、Oracle函数(字符串中搜索字符位置(全角算1字符))的相关信息,可以在本站进行搜索。

本文标签: