From 199cff6cf999cdfbc0fd25493baa6d823251573f Mon Sep 17 00:00:00 2001 From: Shine wOng <1551885@tongji.edu.cn> Date: Fri, 4 Oct 2019 20:58:28 +0800 Subject: [PATCH] commit karp_rabin.md. --- thu_dsa/chp11/bm.md | 1 + thu_dsa/chp11/karp_rabin.md | 87 +++++++++++++++++++++++++++ thu_dsa/chp11/update_fingerprint.png | Bin 0 -> 17582 bytes words.md | 8 +-- 4 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 thu_dsa/chp11/karp_rabin.md create mode 100644 thu_dsa/chp11/update_fingerprint.png diff --git a/thu_dsa/chp11/bm.md b/thu_dsa/chp11/bm.md index 48fbd35..08b1718 100644 --- a/thu_dsa/chp11/bm.md +++ b/thu_dsa/chp11/bm.md @@ -112,6 +112,7 @@ int match(char* text, char* pattern){ j = m - 1; } delete [] bc; + delete [] gs; return i; } ``` diff --git a/thu_dsa/chp11/karp_rabin.md b/thu_dsa/chp11/karp_rabin.md new file mode 100644 index 0000000..c3fd31f --- /dev/null +++ b/thu_dsa/chp11/karp_rabin.md @@ -0,0 +1,87 @@ +串匹配之karp-rabin算法 +===================== + +## 万物皆数 + +回想我们平时对整数进行的比较,都可以在`O(1)`的时间内完成,而任何数据在计算机中的存储都是一系列的字节构成的二进制整数,串也不例外,那为什么不可以把对整数高效的比较操作也移植到串匹配问题上呢?这就是`karp-rabin`的基本思想。 + +一般地,对于任意一个串,设字符集的大小为`d`,则该串中的任意一个字符都可以用一个`d+1`进制的整数来表示。需要注意的是,这里是`d+1`进制,而不是`d`进制,是因为不能用`0`来表示任意一个字符,否则如果该字符组成串的一个前缀,无论前缀的长度多少,都不会影响串所对应的整数取值。 + +在这种情况下,任意一个串,都可以将之用整数表示出来,并且串与这个整数是唯一对应的,因此这是一个`完美散列`,因此将该整数成为串的`指纹`(fingerprint)。如果将该`指纹`转化为二进制整数,就可以在计算机中用二进制字节流唯一的表示一个字符串了。 + +## karp-rabin算法 + +根据上面的分析似乎已经可以构造出一个新的串匹配算法了,具体说来,在每一个对齐位置,将模式串和与之对齐的文本串的`m`个字符,分别用其`指纹`表示出来,然后利用整数的比较就可以在`O(1)`时间内完成比较,这样整体的时间复杂度为`O(n)`,已经和`kmp`算法相当了!可是,果真这么简单吗? + +答案是否定的,因为该过程中还存在着其他开销——比如将长度为`m`串转化为其对应的`指纹`,其开销就已经是`O(m)`了,因此整个算法的时间开销是`O(mn)`,与蛮力策略相当!此外,还存在一些新的问题,当字符集较大,或者串长度较长时,其转化成的`指纹`位数也会相当长,比如采用`ASCII`码字符集时,字符集的大小`d = 128`,如果模式串的长度`m = 10`,则其对应的`指纹`会占`7 x 10 = 70`个比特,已经超过了计算机中通常支持的整数位数,并且随着串的进一步增长,对这么多位`指纹`的比对也难以在`O(1)`时间内完成,而是也要消耗`O(m)`的时间,同时对这些整数的存储也是一个问题。 + +下面就从各个方面分别讨论怎么解决上述存在的这么多问题。 + +> 指纹长度的压缩 + +将更大的数据,存储到更小的空间,这其实是我们在[散列的基本概念](../chp9/hash.mg)中就提出过的问题。具体说来,为了将`70bits`乃至更长的`指纹`压缩到`32bit`整数表示的范围内,只需要对该`指纹`做一个散列,不妨就简明地采用模余法,即 + +```c +hash(fingerprint) = fingerprint % M; +``` + +这样,就一次性地解决了整数的存储与比对时间的问题,经过散列后的指纹可以存储计算机通常支持的位长度以内,并且此时对`指纹`的比对又只需要`O(1)`的时间了。 + +但是由于散列内在的缺陷,不可避免地又会引入新的问题——冲突。对于两个不相匹配的串,它们经过压缩后的`指纹`却有可能相同,此时就会导致误判。为了解决这个问题,可以使`指纹`相同作为串匹配的必要条件,一旦发现两个串的`指纹`相同,可以对它们再启动一次逐个比较的字符比对,来确定这两个串是否的确是匹配的。需要指出,只要这里的散列长度足够长,就可以保证一般情况下两个不匹配的串,其指纹相同的概率极低,从而引入的逐个字符比对并不会显著地增加算法的时间复杂度。 + +> 快速指纹更新 + +尽管在引入了散列以后,指纹的比对可以在`O(1)`时间内完成了,但是指纹的计算仍然需要`O(m)`的时间,此时`karp-rabin`算法整体的时间复杂度仍然是`O(mn)`,没有显著的提高,因此需要提供一种快速的指纹计算方法。 + +对于模式串而言,指纹的计算是没有办法提高了,因为`m`个字符肯定需要全部遍历一次才能计算出它对应的指纹,`O(m)`的时间复杂度没有任何可以提高的空间。 + +但是对于文本串则不然,诚然,对于任意一个长度为`m`的串,计算其指纹也必须需要`O(m)`的时间开销,但是在文本串中,可以注意到,相邻串的指纹是具有一定的联系的,如下图所示: + +![update_fingerprint](update_fingerprint.png) + +具体说来,相邻串只有最前一个字符和最后一个字符是不相同的,利用模余的运算法则,就可以根据前一个串的指纹,在`O(1)`时间内计算出下一个串的指纹。设`a, b`分别是两个正整数,且有`a > b > 0`,具体利用到的运算法则是, + +``` +(a + b) % M = ((a % M) + (b % M)) % M = ((a % M) + b) % M = ((b % M) + a) % M; +(a - b) % M = ((a % M) - (b % M) + M) % M; +(a * b) % M = ((a % M) * (b % M)) % M; +``` + +上述的运算法则均可以推广到多个正整数的情形。因此,就可以构造出计算模式串和文本串的初始`指纹`的代码: + +```c +m = strlen(P); +HashCode hashP = 0, hashT = 0; +for(int i = 0; i < m; ++i){ + hashP = (hashP * R + DIGIT(P, i)) % M; + hashT = (hashT * R + DIGIT(T, i)) % M; +} +``` + +为了快速更新文本串相邻的长度为`m`的子串的`指纹`,需要首先从原先的指纹中,减去最高位的部分,再加上最低位的部分,而计算最高位字符的模余值,需要做`m - 1`次连乘运算,即 + +``` +fingerprint(P[0]) = P[0] * R^(m - 1) +``` + +为了简化这个运算,可以事先将`R^(m - 1)`计算并保存,形成下面的代码: + +```c +HashCode prepareDm(int m){ + HashCode Dm = 1; + for(int i = 0; i != m; ++i) + Dm = (Dm * R) % M; + return Dm; +} +``` + +可以注意到,上面计算得出的`Dm`,正是`R^(m - 1)`的模余值,这里是利用到了模余的第三条运算法则。所以可以形成下面的快速更新`指纹`的代码: + +```c +void updateHash(HashCode &hashT, char* T, int m, int k, HashCode Dm){ + hashT = (hashT - DIGIT(T, k - 1) * Dm + M) % M; + hashT = (hashT * R + DIGIT(T, k - 1 + m)) % M; +} +``` + +该算法其实就是上面三条模余的运算法则的反复使用。 diff --git a/thu_dsa/chp11/update_fingerprint.png b/thu_dsa/chp11/update_fingerprint.png new file mode 100644 index 0000000000000000000000000000000000000000..4b9a16aa5ef84fc63b49023fad7f3156c8fb5d23 GIT binary patch literal 17582 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 F{{^Pw9oGN= literal 0 HcmV?d00001 diff --git a/words.md b/words.md index 8a26613..ca90261 100644 --- a/words.md +++ b/words.md @@ -1001,7 +1001,7 @@ Some Words + pledge > (n)s serious promise or agreement, especially one made publicly or officially.
-> (v)to make a formal, usually public, promise that you will do something, promise. +> (v)to make a formal, usually public promise that you will do something, promise. - the government's pledge to make no deals with terrorists - Eisenhower fulfilled his election pledge to end the war. @@ -1034,14 +1034,14 @@ Some Words - The beauty of the scene defies description + stake -> at stake: if someething is at stake, it is being risked and might be lost or damaged if you are not successful.
+> at stake: if something is at stake, it is being risked and might be lost or damaged if you are not successful.
> (n)the stakes involved in in a contest or a risky action are the things that can be gained or lost
-> (v)if you stake something such as your money or your reputation on the result of something, you risk your money or reputationo on it.
+> (v)if you stake something such as your money or your reputation on the result of something, you risk your money or reputation on it.
> (n)if you have a stake in a business, you have invested money in it.
> have a stake in sth: if you have a stake in something, you will get advantages if it's successful, and you feel you have an important connection with it. - The tension was naturally high for a game with so much at stake. - - The game was usually play for high stakes between two large groups. + - The game was usually played for high stakes between two large groups. - He has staked his political future on an election victory. - He holds a 51% stake in the firm. - Young people don't feel they have a stake in the country's future.