Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 字符串匹配的Rabin-Karp方法_Algorithm_Rabin Karp - Fatal编程技术网

Algorithm 字符串匹配的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

使用Rabin-Karp方法进行字符串匹配,该方法使用了多少个字符匹配? 其中:


让我们从算法本身开始。拉宾-卡普方法是如何工作的。我将使用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