如果我有子串S 0 ,S 1 ,... S n ,计算出的CRC C 0 ,C 1 ,... C n ,我能够确定连接输入S的CRC C 0 ... n sub> 0 S 1 ... S n 的效率比线性处理整个字符串的效率要高得多吗?
显然,C 0 ... n = CRC(S 1 ... n ,用C 0 初始化),但是我想知道C 0 ... n = f(C 0 ,C 1 ,... C n )对于某些具有O(n)复杂度的f()而不是O(| S 0 S 1 ... S n |)
答案 0 :(得分:4)
是。您可以在zlib中了解crc32_combine()
的实施方式。它需要crc1
,crc2
和len2
,其中len2
是计算crc2
的块中的字节数。需要O(log(len2
))时间。可以对以下块重复该组合。
方法是继续crc1
上的CRC计算,然后是len2
个零字节,然后是异或 - crc2
。 len2
字节应用零运算符,该运算符重复平方并应用于1
中的每个len2
位,这允许O(log(len2
))执行时间。该例程于2004年被添加到zlib。