我有两个文件 - 让我们称它们为file0和file1。
我想得到的是以下问题的快速算法(我知道如何编写一个相当慢的算法来解决它):
检测file0的最大后缀是否为file1的前缀,这意味着找到一个最大长度的内存块B(或更准确地说:这样一个内存块的字节数),使得
- file0由某个内存块A和B组成 - file1由内存块B和某个内存块C组成
请注意,块A、B和C的长度也可以为零字节。
编辑(回答drysdam的评论):我所想到的显然比较慢的算法(伪代码):让文件的长度被m、n限制,wlog m <= n。
我想得到的是以下问题的快速算法(我知道如何编写一个相当慢的算法来解决它):
检测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位地址空间了。