我的方法是首先制作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
最后,按其第一个元素(在
A
中的位置)对
shared
进行排序,并检查其所有第二个元素(在
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)。