Ваша проблема: учитывая два набора элементов, найдите промежуточное действие (элементы, общие для обоих), оставаясь в рамках ограничений нехватки ОЗУ (меньше, чем размер любого набора).
С момента нахожденияIntersaction требует сравнения / поиска каждого элемента в другом наборе, у вас должно быть достаточно оперативной памяти для хранения хотя бы одного из наборов (меньшего), чтобы иметь эффективный алгоритм.
Предположим, вы знаете, чтоintersaction намного меньше обоих наборов и полностью помещается в доступную память - в противном случае вам придется проделать дополнительную работу по сбросу результатов на диск.
Если вы работаете в условиях ограничений памяти, разбейте больше разбито на части, которые помещаются в 1/3 доступной памяти.Затем разделите набор меньший на части, соответствующие второй 1/3.Оставшаяся 1/3 памяти используется для хранения результатов.
Оптимизируйте, находя максимальные и минимальные значения раздела для набора большего .Это набор, который вы сравниваете с .Затем при загрузке соответствующего раздела из набора меньшего размера пропустите все элементы, находящиеся за пределами диапазона min-max.
Сначала найдите взаимодействие двух разделов через двойной цикл, сохраняя общие элементы длянабор результатов и удаление их из исходных наборов, чтобы сэкономить на сравнениях в дальнейшем.
Затем замените раздел в наборе меньший вторым разделом (пропуская элементы вне минимальногоМаксимум).Повторение.Обратите внимание, что раздел в наборе больше уменьшен - с уже удаленными общими элементами.
После прохождения всего набора меньшего повторите с следующим разделом больше .
Теперь, если вам не нужно сохранять два исходных набора (например, вы можете перезаписать оба файла), то вы можете выполнить дополнительную оптимизацию, удалив общие элементы с диска какЧто ж.Таким образом, эти элементы больше не нужно сравнивать в последующих разделах.Затем вы разбиваете наборы, пропуская удаленные.