我有两个文件 - 我们称它们为 file0 和 file1。
我想得到的是针对以下问题的快速算法(我很清楚如何编写一个相当慢的算法来解决它):
检测file0的最大后缀,它是file1的前缀,这意味着一个最大长度的内存块B(或更准确地说:这样一个内存块的字节数),使得
- file0 由一些内存块 A 组成,然后是 B
- file1 由内存块 B 组成,后跟一些内存块 C
请注意,块 A、B 和 C 的长度也可以为零字节。
编辑(回答drysdam的评论):我想到的明显相当慢的算法(伪代码):让文件的长度以m为界,n与wlog m<=n。
for each length from m to 0
compare the m last bytes of file0 with the first m bytes of file1
if they are equal
return length
这显然是一个 O(m*min(m, n)) 算法。如果文件大小相同,则为 O(n^2)。
我目前必须处理的文件大小为 10 到几百兆字节。但在极端情况下,它们的大小也可能只有几千兆字节——只是大到不再适合 x86 的 32 位地址空间。