Если у вас есть шаблон, такой как A1 = 1111122222
и A2 = 2222211111
, то вы получите (N / 2) 4 пар. Поэтому в худшем случае вы не можете сделать лучше, чем O (N 4 ).
Ниже приведено решение O (N 4 ), которое обрабатывает дубликаты и некоторые числа, встречающиеся только в одном из двух списков. Обратите внимание, что хотя в худшем случае это O (N 4 ), его средний случай O (N 2 ) гораздо более вероятен, аналогично сложности быстрой сортировки . * * 1015
index = {} # dictionary of lists defaulting to []
for i in 0..len(A2):
index[A2[i]].append(i)
for i1 in 0..len(A1):
for j1 in i+1..len(A1):
for i2 in index[A1[i1]]:
for j2 in index[A1[j1]]:
if i2 != j2 and i1 < j1 != i2 < j2:
print A1[i1], A1[j1]
Если мы слегка ослабим формат вывода, чтобы разрешить вывод (1, 2) * 7
, чтобы указать 7 разворотов, то мы можем добиться большего. Сначала заархивируйте списки, указав [(2, 1), (6, 2), (5, 3), (8, 4), (1, 5), (3, 6)]
для примера. Сортируйте массивы с помощью стабильной сортировки: сначала используйте первый элемент в каждом кортеже, затем сортируйте другую копию списка, используя второй элемент в кортеже. Затем используйте адаптированную сортировку слиянием, подобную упомянутой здесь , но вместо того, чтобы считать, мы производим, мы выводим инверсии. Это решение O (NlogN).