Algorithm 为什么每次在Rabin-Karp算法中哈希值相同时,我们都需要检查模式匹配

Algorithm 为什么每次在Rabin-Karp算法中哈希值相同时,我们都需要检查模式匹配,algorithm,hash,rabin-karp,Algorithm,Hash,Rabin Karp,我不明白为什么每次哈希为模式和文本返回相同的值时都需要检查子字符串匹配。为字符串返回的哈希值不是唯一的吗?Rabin-Karp算法中使用的哈希函数是一个“”函数,例如,之所以选择它,是因为它的特性是可以基于上一个哈希轻松计算哈希,而不是因为它的抗冲突性 在Rabin-Karp算法中,我们需要计算滑动子串的哈希值。例如,假设我们正在本文本中搜索24个字符的字符串: "this is the text we are comparing" 我们需要计算这些子字符串的哈希: "this is the

我不明白为什么每次哈希为模式和文本返回相同的值时都需要检查子字符串匹配。为字符串返回的哈希值不是唯一的吗?

Rabin-Karp算法中使用的哈希函数是一个“”函数,例如,之所以选择它,是因为它的特性是可以基于上一个哈希轻松计算哈希,而不是因为它的抗冲突性

在Rabin-Karp算法中,我们需要计算滑动子串的哈希值。例如,假设我们正在本文本中搜索24个字符的字符串:

"this is the text we are comparing"
我们需要计算这些子字符串的哈希:

"this is the text we are "
"his is the text we are c"
"is is the text we are co"
"s is the text we are com"
" is the text we are comp"
"is the text we are compa"
"s the text we are compar"
" the text we are compari"
"the text we are comparin"
"he text we are comparing"
因此,我们选择一个“滚动哈希”函数,其中,在计算第一个子字符串的哈希后,我们可以使用第一个哈希、从子字符串中删除的字符以及添加到其中的字符来计算第二个子字符串的哈希:

"this is the text we are "  ->  hash1
"his is the text we are c"  ->  hash1 -t +c  ->  hash2
这种“滚动散列”函数不一定像加密散列函数那样,查找具有相同散列的两个字符串的可能性很小。因此,哈希相同的事实并不保证子字符串与搜索字符串相同;因此,我们需要做一个完整的字符串比较来确定

请注意,任何创建比输入短的哈希的哈希函数都必然会发生冲突。使用比输入字符串短得多的散列是Rabin-Karp算法的要点;比较哈希比比较长字符串更有效