Указанные два массива со следующей структурой:Python слияния несортированных списков - анализ алгоритма
array = [(index_1, item_1), (index_2, item_2), ..., (index_n, item_n)]
Внутри массива элементы могут быть просто не упорядочены, например двух списков Python:
arr1 = [(1,'A'), (2, 'B'), (3,'C')]
arr2 = [(3,'c'), (2, 'b'), (1,'a')]
Я хотел бы проанализировать слияние этих массивов. Есть два способа, которыми я мог бы думать о слиянии. Первый из них был бы наивным итерации по обоим массивов:
merged = []
for item in arr:
for item2 in arr2:
if item[0] == item2[0]:
merged.append((item[0], item[1], item2[1]))
# merged
# [(1, 'A', 'a'), (2, 'B', 'b'), (3, 'C', 'c')]
Этот наивный подход будет в большой-о О (п ** 2),
Немного лучше было бы (?) сортировать массивы первые (с Python сортировки будучи O (п § п)):
arr.sort(key=lambda t: t[0])
arr2.sort(key=lambda t: t[0])
for idx, item in enumerate(arrs):
merged_s.append(tuple(list(item)+[arr2s[idx][1]]))
Так что этот подход будет O (N журнал N) в общей сложности, этот анализ правильно?
Что относительно случая, когда списки имеют неравные длины m
и n
?
Есть ли более эффективный способ сортировки как первым?
Каким должен быть результат, если элементы отсутствуют? – thefourtheye
Вы говорите, что длина двух массивов всегда будет одинаковой? – Shrey
'tuple (list (item) + [arr2s [idx] [1]])' может быть 'item + arr2s [idx] [1:]'. Поскольку кусочек кортежа является кортежем, а '+' объединяет кортежи точно так же, как списки. –