Algorithm 字符串匹配的Rabin-Karp方法
使用Rabin-Karp方法进行字符串匹配,该方法使用了多少个字符匹配? 其中:Algorithm 字符串匹配的Rabin-Karp方法,algorithm,rabin-karp,Algorithm,Rabin Karp,使用Rabin-Karp方法进行字符串匹配,该方法使用了多少个字符匹配? 其中: 让我们从算法本身开始。拉宾-卡普方法是如何工作的。我将使用C#代码来进行说明。 拥有 我们计算目标的哈希值: int targetHash = RabinHash(target); 然后有效地计算targetlength的所有子串的哈希值(这里是长度4的子串): “abca”,“bcab”“cacd”。如果targetHash等于子字符串的哈希值,我们将此子字符串与 目标对应的字母。例如: 如果targetH
让我们从算法本身开始。拉宾-卡普方法是如何工作的。我将使用C#代码来进行说明。 拥有 我们计算
目标的哈希值
:
int targetHash = RabinHash(target);
然后有效地计算target
length的所有子串的哈希值(这里是长度4
的子串):
“abca”
,“bcab”
<代码>“cacd”。如果targetHash
等于子字符串的哈希值,我们将此子字符串与
目标
对应的字母。例如:
如果targetHash=888
对于子字符串,我们有
abca : 555
bcab : 345
cabc : 888 <- check this (failure due to hash collision)
abca : 555
bcab : 345
cabc : 888 <- check this (failure due to hash collision)
abca : 555
bcac : 888 <- check this (success)
cacd : 900
应检查所有9子字符串的字符
最佳情况:我们没有哈希冲突;比如说,我们可以实现一个典型的Rabin哈希函数
int RabinHash(string value) => value.Aggregate(0, (s, a) => s * 26 + a - 'a');
我们应该检查唯一的1实际匹配:
string target = "bcac";
string source = "abcabcabcacd";
// int RabinHash(string value) => 1;
int RabinHash(string value) => value.Aggregate(0, (s, a) => s * 26 + a - 'a');
int targetHash = RabinHash(target);
var report = Enumerable
.Range(0, source.Length - target.Length + 1)
.Select(i => source.Substring(i, target.Length))
.Select(chunk => new {
chunk,
hash = RabinHash(chunk)
})
.Select(item => $"{item.chunk} : {item.hash,5} {(item.hash == targetHash ? "<- check it" : "")}");
Console.Write(report);
string target=“bcac”;
字符串source=“abcabcd”;
//int-RabinHash(字符串值)=>1;
int-RabinHash(字符串值)=>value.Aggregate(0,(s,a)=>s*26+a-'a');
int targetHash=拉宾哈什(目标);
var报告=可枚举
.Range(0,源.Length-目标.Length+1)
.Select(i=>source.Substring(i,target.Length))
.Select(chunk=>new{
大块
hash=RabinHash(块)
})
.Select(item=>$”{item.chunk}:{item.hash,5}{(item.hash==targetHash?)1.研究Rabin-Karp方法。2.运行该方法,计算字符匹配数。3.返回结果。
int RabinHash(string value) => 1;
int RabinHash(string value) => value.Aggregate(0, (s, a) => s * 26 + a - 'a');
string target = "bcac";
string source = "abcabcabcacd";
// int RabinHash(string value) => 1;
int RabinHash(string value) => value.Aggregate(0, (s, a) => s * 26 + a - 'a');
int targetHash = RabinHash(target);
var report = Enumerable
.Range(0, source.Length - target.Length + 1)
.Select(i => source.Substring(i, target.Length))
.Select(chunk => new {
chunk,
hash = RabinHash(chunk)
})
.Select(item => $"{item.chunk} : {item.hash,5} {(item.hash == targetHash ? "<- check it" : "")}");
Console.Write(report);
abca : 728
bcab : 18929
cabc : 35180
abca : 728
bcab : 18929
cabc : 35180
abca : 728
bcac : 18930 <- check it
cacd : 35207