27. Merge k Sorted Lists


道しるべ
  • k個のソートされたリストをソートされたリストにマージします.


  • 1.優先キューを使用してリストをマージ

    
    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, val=0, next=None):
    #         self.val = val
    #         self.next = next
    class Solution:
        def mergeKLists(self, lists: List[ListNode]) -> ListNode:
            root = result = ListNode(None)
            heap = []
            
            #각 연결 리스트의 루트를 힙에 저장
            for i in range(len(lists)):
                if lists[i]:
                    heapq.heappush(heap, (lists[i].val, i, lists[i]))
                    
            
            #힙 추출 이후 다음 노드는 다시 저장
            while heap:
                node = heapq.heappop(heap)
                idx = node[1]
                result.next = node[2]
                
                result = result.next
                
                if result.next:
                    heapq.heappush(heap, (result.next.val, idx, result.next))
                    
            return root.next
            
    

  • この問題の難易度は「困難」と表記されているが、実際には優先順位キューを使用して簡単に解くことができる.

  • ほとんどの優先キュープールではheapqモジュールがほとんど使用されていますので、よく理解してください.

  • listsは、3つの接続リスト[1,4,5],[1,3,4]および[2,6]からなる入力値であり、このコードは、各接続リストのルートをhipに格納する.

  • heapqモジュールは最小heap(最小heap)をサポートするためlstである.valは小さな順序でpop()することができる.
  • がこのように保存されると、タイプエラー:「ListNode」と「ListNode」インスタンスの間に「<」をサポートしないエラーが発生し、このエラーメッセージは直感的ではなく理解しにくいが、「重複値を入れられない」ことを示す.

  • この問題の例の入力値は、3つの接続リストで、1番目と2番目のルートがそれぞれ1です.このように同じ値はheappush()関数でエラーが発生するため、重複する値を区別するために追加のパラメータが必要です.
  • エラーを防止するために、接続リストの順序
  • を挿入します.

  • 次に、heapppop()を使用して値を抽出すると、最小ノードの接続リストから開始し、結果を生成するノード結果にこれらの値を追加します.

  • k個の接続リストは、常にhipに含まれなければならないため、抽出された接続リストの次のノードがhipに再び追加されます.

  • hipで値を繰り返すと、resultは小さなノードから順次接続されます.
  • ✔優先キュー


  • 優先キュー
  • キューやスタックなどの抽象データ型と似ていますが、各要素の「優先度」にも関連しています.

  • 優先度キューは、特定の条件に基づいて最も優先度の高い要素を抽出するデータ型です.
  • は、例えば、キューに[1,4,5,3,2]が含まれ、最も抽出された優先順位キューがあると仮定すると、この場合、常に残りの要素の最も値を優先順位に従って5,4,3,2,1の順に抽出する.

  • これは、ソートアルゴリズムを使用して、優先クラウドキューを作成できることを意味します.

  • n個の要素をソートするのにS(n)の時間が必要である場合、新しい要素の挿入または削除にはO(S(n)の時間が必要である.

  • 逆に降順で並べ替える場合、最上位を取得するには最上位の値を取得するだけなので、O(1)を選択できます.

  • ソートには通常O(nlogn)が必要であるため、O(S(n)はO(nlogn)程度が必要である.
    しかし、実際には、このような簡単なソートよりも、お尻のソートなどを使うほうが効果的です.

  • このほか,最短経路を探索するDijikstraアルゴリズムなどの優先順位キューは異なる分野にも適用可能であり,HIP(Heap)データ構造にも大きく関係している.