Python
 Computer >> コンピューター >  >> プログラミング >> Python

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, ]

  1. Pythonでのマージソートについて説明する

    マージソートはソート手法です。これは、時間計算量が( n logn )の効率的な並べ替えアルゴリズムです。 )ここで、nはソートされる配列の長さです。 マージソートは、DivideandConquersパラダイムに従うアルゴリズムです。配列を2つの等しい半分に連続的に分割します。その後、それぞれが1つの要素を持つリストの並べ替えを開始し、並べ替えられたリストを継続的にマージして、完全な並べ替えリストを形成します。 したがって、ソートされた配列を取得します。 例 紫色のボックスと黒い矢印は、リストが2つに分割されていることを示しています。 緑色のボックスと赤い矢印は、並べ替え

  2. Pythonでの継承

    この記事では、Python3.xでの継承と拡張クラスについて学習します。またはそれ以前。 継承は実際の関係をうまく表し、再利用性を提供し、推移性をサポートします。開発時間が短縮され、メンテナンスが容易になり、拡張も容易になります。 継承は大きく5つのタイプに分類されます- シングル 複数 階層的 マルチレベル ハイブリッド 上の図に示されているように、継承とは、実際に親クラスのオブジェクトを作成せずに、他のクラスの機能にアクセスしようとするプロセスです。 ここでは、単一の階層型継承の実装について学習します。 単一継承 例 # parent class class Studen