У меня есть два файла — назовем их файл0 и файл1.
Я хотел бы получить быстрый алгоритм для следующей задачи (мне понятно, как написать довольно медленный алгоритм, решающий ее):
Определить наибольший суффикс файла0, который является префиксом файла1, что означает блок памяти 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 до нескольких сотен мегабайт. Но в крайних случаях они также могут иметь размер в несколько гигабайт - достаточно большой, чтобы больше не вписываться в 32-битное адресное пространство x86.