Pythonでk個のソート済みリストをマージする
いくつかのリストがあると仮定します。これらはソートされています。これらのリストを1つのリストにマージする必要があります。これを解決するために、ヒープデータ構造を使用します。したがって、リストが[1,4,5]、[1,3,4]、[2,6]の場合、最終的なリストは[1,1,2,3,4,4,5,6]になります。 。
これを解決するには、次の手順に従います-
-
1つのヒープを作成する
-
リスト内のリンクリストlごとに-
-
が0でない場合は、Iをヒープに挿入します
-
-
res:=nullおよびres_next:=null
-
1つの無限ループを実行します-
-
temp:=ヒープの最小値
-
ヒープに要素がない場合は、resを返します
-
resが0の場合、
-
res:=temp、res_next:=temp
-
temp:=tempの次の要素
-
tempがゼロでない場合は、tempをヒープに挿入します
-
次の解像度:=null
-
-
それ以外の場合-
-
next of res_next:=temp、temp:=next of temp、res_next:=next of res_next
-
tempがnullでない場合は、tempをヒープに挿入します
-
次のres_next:=null
-
-
例
理解を深めるために、次の実装を見てみましょう-
class ListNode: def __init__(self, data, next = None): self.val = data self.next = next def make_list(elements): head = ListNode(elements[0]) for element in elements[1:]: ptr = head while ptr.next: ptr = ptr.next ptr.next = ListNode(element) return head def print_list(head): ptr = head print('[', end = "") while ptr: print(ptr.val, end = ", ") ptr = ptr.next print(']') class Heap: def __init__(self): self.arr = [] def print_heap(self): res = " " for i in self.arr: res += str(i.val) + " " print(res) def getVal(self,i): return self.arr[i].val def parent(self,i): return (i-1)//2 def left(self,i): return (2*i + 1) def right(self,i): return (2*i + 2) def insert(self,value): self.arr.append(value) n = len(self.arr)-1 i = n while i != 0 and self.arr[i].val<self.arr[self.parent(i)].val: self.arr[i],self.arr[self.parent(i)] = self.arr[self.parent(i)],self.arr[i] i = self.parent(i) def heapify(self,i): left = self.left(i) right = self.right(i) smallest = i n= len(self.arr) if left<n and self.getVal(left)<self.getVal(smallest): smallest = left if right <n and self.getVal(right)<self.getVal(smallest): smallest = right if smallest!=i: self.arr[i],self.arr[smallest] = self.arr[smallest],self.arr[i] self.heapify(smallest) def extractMin(self): n = len(self.arr) if n==0: return '#' if n== 1: temp =self.arr[0] self.arr.pop() return temp root = self.arr[0] self.arr[0] = self.arr[-1] self.arr.pop() self.heapify(0) return root class Solution(object): def mergeKLists(self, lists): heap = Heap() for i in lists: if i: heap.insert(i) res = None res_next = None while True: temp = heap.extractMin() if temp == "#": return res if not res: res = temp res_next = temp temp = temp.next if temp: heap.insert(temp) res.next = None else: res_next.next = temp temp = temp.next res_next=res_next.next if temp: heap.insert(temp) res_next.next = None ob = Solution() lists = [[1,4,5],[1,3,4],[2,6]] lls = [] for ll in lists: l = make_list(ll) lls.append(l) print_list(ob.mergeKLists(lls))
入力
[[1,4,5],[1,3,4],[2,6]]
出力
[1, 1, 2, 3, 4, 4, 5, 6, ]
-
Pythonでのマージソートについて説明する
マージソートはソート手法です。これは、時間計算量が( n logn )の効率的な並べ替えアルゴリズムです。 )ここで、nはソートされる配列の長さです。 マージソートは、DivideandConquersパラダイムに従うアルゴリズムです。配列を2つの等しい半分に連続的に分割します。その後、それぞれが1つの要素を持つリストの並べ替えを開始し、並べ替えられたリストを継続的にマージして、完全な並べ替えリストを形成します。 したがって、ソートされた配列を取得します。 例 紫色のボックスと黒い矢印は、リストが2つに分割されていることを示しています。 緑色のボックスと赤い矢印は、並べ替え
-
Pythonでの継承
この記事では、Python3.xでの継承と拡張クラスについて学習します。またはそれ以前。 継承は実際の関係をうまく表し、再利用性を提供し、推移性をサポートします。開発時間が短縮され、メンテナンスが容易になり、拡張も容易になります。 継承は大きく5つのタイプに分類されます- シングル 複数 階層的 マルチレベル ハイブリッド 上の図に示されているように、継承とは、実際に親クラスのオブジェクトを作成せずに、他のクラスの機能にアクセスしようとするプロセスです。 ここでは、単一の階層型継承の実装について学習します。 単一継承 例 # parent class class Studen