Мой подход заключается в том, чтобы сначала сделать отсортированные копии A
и B
, которые также записывают позиции элементов в исходных списках:
for i in 1 .. length(A):
Apos[i] = (A, i)
sortedApos = sort(Apos[] by first element of each pair)
for i in 1 .. length(B):
Bpos[i] = (B, i)
sortedBpos = sort(Bpos[] by first element of each pair)
Теперь найдите эти элементы совместно, используя стандартнуюобъединение списка, которое записывает позиции как в A
, так и в B
общих элементов:
i = 1
j = 1
shared = []
while i <= length(A) && j <= length(B)
if sortedApos[i][1] < sortedBpos[j][1]
++i
else if sortedApos[i][1] > sortedBpos[j][1]
++j
else // They're equal
append(shared, (sortedApos[i][2], sortedBpos[j][2]))
++i
++j
Наконец, сортируйте shared
по его первому элементу (позиция в A
) и проверяйте, чтобы всеего вторые элементы (позиции в B
) увеличиваются.Это будет иметь место, если элементы, общие для A
и B
, появятся в одном и том же порядке:
sortedShared = sort(shared[] by first element of each pair)
for i = 2 .. length(sortedShared)
if sortedShared[i][2] < sortedShared[i-1][2]
return DIFFERENT
return SAME
Сложность времени: 2 * (O (n) + O (nlog n)) +O (n) + O (nlog n) + O (n) = O (nlog n) .