String Rabin-karp字符串匹配算法复杂度

String Rabin-karp字符串匹配算法复杂度,string,algorithm,match,String,Algorithm,Match,在拉宾算法中采用模有助于降低本机horners规则字符串匹配的复杂性。请任何人解释一下我猜horners规则意味着将字符串视为某个基数中的数字(“abcd”='a'*p^3+'b'*p^2+'c'*p^1+'d'*p^0)并将字符串作为数字进行比较,拉宾算法指的是本质上相同的东西,但模化了其他的数 使用Horners规则,您只能比较短字符串,否则会出现溢出(您可以使用大整数来避免溢出,但这会降低复杂性。与长度为n的字符串对应的数字将有O(n)个数字,因此算术运算不会在O(1)中完成) 在Rabi

在拉宾算法中采用模有助于降低本机horners规则字符串匹配的复杂性。请任何人解释一下

我猜horners规则意味着将字符串视为某个基数中的数字(“abcd”='a'*p^3+'b'*p^2+'c'*p^1+'d'*p^0)并将字符串作为数字进行比较,拉宾算法指的是本质上相同的东西,但模化了其他的数

使用Horners规则,您只能比较短字符串,否则会出现溢出(您可以使用大整数来避免溢出,但这会降低复杂性。与长度为n的字符串对应的数字将有O(n)个数字,因此算术运算不会在O(1)中完成)


在Rabin-Karp算法中,与字符串相对应的数字将保持较小,因为我们将它们模化为其他数字。它可能会导致冲突,但如果我们幸运的话,冲突是非常罕见的。

定义“本机horners规则字符串匹配”horner的规则是如果你在基数x中有一个数字,那么为了最小化乘法的数量,它可以写为-x(x(…)+)+)+。例如:1234可以写成10(10(10(1)+2)+3)+4在这两种情况下,我们都在计算数字,我们直接比较它,然后比较它的mod,那么它是如何降低复杂性的?当数字变大时,你不能再进行比较,在O(1)时间内对它进行加法和乘法。比较和加法需要O(m)运算,其中m是位数,乘法的复杂度甚至更高,m将与子字符串长度成比例。假设您试图在长度100000的字符串中找到长度50000的子字符串。你会用什么数字来表示子字符串?谢谢,我在某种程度上理解了,有没有网站会对其进行进一步的阐述?你到底想读些什么?如果你搜索包含算法结构化信息的站点,我只能用俄语命名一些站点(比如e-maxx.ru/algo)。。。但如果是某个特定的主题,通常可以很容易地找到一些英文文章,例如,这里有一个关于字符串搜索算法的教程:(包括Rabin-Karp算法的代码和解释)