27. Merge k Sorted Lists
6258 ワード
道しるべ k個のソートされたリストをソートされたリストにマージします.
この問題の難易度は「困難」と表記されているが、実際には優先順位キューを使用して簡単に解くことができる.
ほとんどの優先キュープールでは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)データ構造にも大きく関係している.
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()することができる.
この問題の例の入力値は、3つの接続リストで、1番目と2番目のルートがそれぞれ1です.このように同じ値はheappush()関数でエラーが発生するため、重複する値を区別するために追加のパラメータが必要です.
次に、heapppop()を使用して値を抽出すると、最小ノードの接続リストから開始し、結果を生成するノード結果にこれらの値を追加します.
k個の接続リストは、常にhipに含まれなければならないため、抽出された接続リストの次のノードがhipに再び追加されます.
hipで値を繰り返すと、resultは小さなノードから順次接続されます.
✔優先キュー
優先キュー
優先度キューは、特定の条件に基づいて最も優先度の高い要素を抽出するデータ型です.
これは、ソートアルゴリズムを使用して、優先クラウドキューを作成できることを意味します.
n個の要素をソートするのにS(n)の時間が必要である場合、新しい要素の挿入または削除にはO(S(n)の時間が必要である.
逆に降順で並べ替える場合、最上位を取得するには最上位の値を取得するだけなので、O(1)を選択できます.
ソートには通常O(nlogn)が必要であるため、O(S(n)はO(nlogn)程度が必要である.
しかし、実際には、このような簡単なソートよりも、お尻のソートなどを使うほうが効果的です.
このほか,最短経路を探索するDijikstraアルゴリズムなどの優先順位キューは異なる分野にも適用可能であり,HIP(Heap)データ構造にも大きく関係している.
Reference
この問題について(27. Merge k Sorted Lists), 我々は、より多くの情報をここで見つけました https://velog.io/@corone_hi/27.-Merge-k-Sorted-Listsテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol