Ответ Роба будет работать для этого конкретного случая.Для более общего случая, когда нужно сравнить два списка, вы можете сделать это за O (m + n) время, если оба списка отсортированы.(Или O (n log n), если вам нужно сначала отсортировать их, но это все равно намного быстрее, чем O (m * n).)
Основной алгоритм сравнения списков выглядит следующим образом:
procedure ListCompare(list1, list2: TWhateverList; [Add extra params here]);
var
i, j: integer;
begin
i := 0;
j := 0;
while (i < list1.Count) and (j < list2.Count) do
begin
if list1[i] < list2[j] then
begin
//handle this appropriately
inc(i);
end
else if list1[i] > list2[j] then
begin
//handle this appropriately
inc(j);
end
else //both elements are equal
begin
//handle this appropriately
inc(i);
inc(j);
end;
end;
//optional cleanup, if needed:
while (i < list1.Count) do
begin
//handle this appropriately
inc(i);
end;
while (j < list2.Count) do
begin
//handle this appropriately
inc(j);
end;
end;
Это можно настроить для целого ряда задач, включая пересечение списков, путем изменения мест «обрабатывать это соответствующим образом», и гарантированно не будет выполняться больше шагов, чем в обоих списках, вместе взятых.Для пересечения списка, добавьте значение равно в некоторый выход, а два других ничего не делают, кроме как передвигают счетчики, и вы можете отключить дополнительную очистку.
Один из способов использовать этот алгоритм - сделатьдополнительные параметры в верхней части указателей на функции и передачи в подпрограммах, которые будут обрабатывать соответствующие случаи, или ноль, чтобы ничего не делать.(Просто убедитесь, что вы проверили на ноль, прежде чем вызывать их, если вы идете по этому пути!) Таким образом, вы должны написать базовый код только один раз.