Цель состоит в том, чтобы написать алгоритм, который вычисляет «начальные списки» (структуру данных) в классе сложности лучше, чем O (m ^ 2)
Что такое начальный список?
Пусть U
будет набором кортежей (например, {(2,5), (5,1), (9,0), (6,4)}
).
Шаг 1:
L1 упорядочен по первому элементу кортежа:
L1 = [ (2,5), (5,1), (6,4), (9,0) ]
и L2 по второму:
L2 = [ (9,0), (5,1), (6,4), (2,5) ]
Шаг 2:
Добавьте индексы кортежа e во втором списке к кортежу e в первом списке:
L1 = [ (2,5,3), (5,1,1), (6,4,2), (9,0,0) ]
и наоборот:
L2 = [ (9,0,3), (5,1,1), (6,4,2), (2,5,0) ]
L1 и L2 теперь называются начальными списками U.
Первая идея реализации, конечно, является исчерпывающим алгоритмом в O (m ^ 2)
U = {(2,5), (5,1), (9,0), (6,4)}
m = len(U)
#step 1:
L1 = [e for e in U]
L1.sort()
L2 = [e for e in U]
L2.sort(key=lambda tup: tup[1])
#step 2:
help = []*len(L1)
for i in range(len(L1)):
help[i] = L1[i][0], L1[i][1], L2.index(L1[i])
for i in range(len(L2)):
L2[i] = L2[i][0], L2[i][1], L1.index(L2[i])
L1 = help
# >>> L1
# [(2, 5, 3), (5, 1, 1), (6, 4, 2), (9, 0, 0)]
# >>> L2
# [(9, 0, 3), (5, 1, 1), (6, 4, 2), (2, 5, 0)]
Так что это работает.Но вызов индекса (O (m)) в цикле for (O (m)) делает его сложность квадратичной.Но как написать алгоритм для этого в O (m * log m)?