У меня есть два файла - давайте назовем их file0 и file1.
Я бы хотел получить быстрый алгоритм для решения следующей задачи (мне ясно, как написать довольно медленный алгоритм, который решает ее):
Определить самый большой суффикс file0, который является префиксом file1, что означает блок памяти B (или, точнее: число байтов такого блока памяти) максимальной длины, так что
- file0 состоит из некоторого блока памяти A, за которым следует B
- file1 состоит из блока памяти B, за которым следует блок памяти C
Обратите внимание, что блоки A, B и C также могут иметь длину нулевых байтов.
Редактировать (чтобы ответить на замечание Драйсдама): очевидный довольно медленный алгоритм, о котором я думаю (псевдокод): пусть длина файлов ограничена m, n с wlog m <= n. </p>
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.