объединить два отсортированных списка элементов в Python

1

Мой вопрос связан с выяснением различных способов слияния 2 отсортированных элементов? Я пытаюсь найти простой способ объединить 2 отсортированных элемента.

def merge(arr1, arr2):
    return sorted(arr1 + arr2)

# Example: merge([1, 4, 7], [2, 3, 6, 9]) => [1, 2, 3, 4, 6, 7, 9]

Я не уверен, что я усложняю это. Это использует встроенную функцию, что означает, что сложнее испортить детали реализации.

Я также обнаружил, что могу использовать функцию merge() из cypthon heapq.

Удивительно, если подумать об использовании другого метода, например:

Gist для слияния в python

  • 1
    В чем вопрос? Что ты пытаешься сделать? Почему это не так?
  • 0
    отсортировано (arr1 + arr2), как вы написали, уже достаточно. Вы можете сравнить сроки различных методов, предложенных в ответах, для очень больших списков и посмотреть, что лучше.
Теги:
merge

3 ответа

1
Лучший ответ

его до вас, какую реализацию вы используете. Рассмотрение вопроса о том, нужен ли вам чистый код или требуется производительность.

Для чистого кода вы можете использовать:

  1. отсортировано (L1 + L2)
  2. сливаться с heappq

оба из них со сложностью O (nlogn)

тогда как эта реализация - https://gist.github.com/Jeffchiucp/9dc2a5108429c4222fe4b2a25e35c778 с сложностью алгоритма O (n).

1

использовать слияние с heapq

>>> l1 = [1, 4, 7]
>>> l2 = [2, 3, 6, 9]
>>> from heapq import merge
>>> list(merge(l1,l2))
[1, 2, 3, 4, 6, 7, 9]
0

Вы не хотите объединять два отсортированных списка и сортировать их снова, это не нужно. Существуют алгоритмы O(n) для объединения отсортированных списков, ваш алгоритм будет O(n log n) из-за сортировки снова. Объединение двух отсортированных списков с использованием Priority queue взятой здесь:

from Queue import PriorityQueue
class Solution(object):
    def mergeKLists(self, lists):
        dummy = ListNode(None)
        curr = dummy
        q = PriorityQueue()
        for node in lists:
            if node: q.put((node.val,node))
        while q.qsize()>0:
            curr.next = q.get()[1]
            curr=curr.next
            if curr.next: q.put((curr.next.val, curr.next))
        return dummy.next

Ещё вопросы

Сообщество Overcoder
Наверх
Меню