データ構造とアルゴリズムの美しさ | Queue(キュー)

列に関する概念

  • 先入れ先出しのキュー
  • キューの 2 つの基本操作: エンキュー (データをキューの最後に入れる) とデキュー (キューの先頭から要素を取得する)
  • キューは、操作が制限された線形テーブル データ構造です。

シーケンシャルキューとチェーンキュー

  • 配列で実装されたキューをシーケンシャルキューと呼びます

      class Queue:
      """
      一个简单的队列实现
      属性:
      	items(list): 队列数组
      """
    
      def __init__(self):
          """
          Queue类的构造函数
          
          参数:
          	无
          
          返回值:
          	无        
          """
          self.items = []
    
      def is_empty(self):
          """
          检查队列是否为空
          
          参数:
          	无
          
          返回值:
          	True 或 False
          """
          return len(self.items) == 0
    
      def enqueue(self, item):
          """
          将一个元素添加到队列中
          
          参数:
          	无
          
          返回值:
          	添加的元素
          """
          self.items.append(item)
    
      def dequeue(self):
          """
          将一个元素从队列中移除
          
          参数:
          	无
          
          返回值:
          	删除的元素值
          """
          if self.is_empty():
              raise Exception("Queue is empty")
          return self.items.pop(0) 
    
  • リンクリストを使用して実装されたキューは、チェーンキューと呼ばれます。

    class Node:
        """
        初始化队列中的每个节点。
        属性:
            val (int): 表示节点值。
            next (int): 表示下一个节点的指针。
        """
        def __init__(self, val):
            """
            节点构造函数。
            
            参数:
                val: 节点的值。
                
            返回:
                无。
            """
            # val 节点的值
            # next 表示下一个节点的指针
            self.val = val
            self.next = None
    
    class Queue:
        """
        实现队列操作。
        属性:
            head (int): 表示队列头部索引的整数。
            tail (int): 表示队列尾部索引的整数。
        """
        def __init__(self):
            """
            队列构造函数。
    
            参数:
                无。
    
            返回:
                无。
            """
            # head 是队列头部节点
            self.head = None
            # tail 是队列尾部节点
            self.tail = None
    
        def enqueue(self, val):
            """
            将新元素添加到队列尾部。
    
            参数:
                val: 要添加到队列尾部的值。
    
            返回:
                无。
            """
            new_node = Node(val)
            if not self.head:
                self.head = new_node
                self.tail = new_node
            else:
                self.tail.next = new_node
                self.tail = new_node
    
        def dequeue(self):
            """
            从队列头部删除元素并返回其值。
    
            参数:
                无。
    
            返回:
                删除的元素值,如果队列为空则返回 None。
            """
            # 检查队列是否为空
            if not self.head:
                return None
            val = self.head.val
            self.head = self.head.next
            # 再次判断,确保队列状态正确
            if not self.head:
                self.tail = None
            return val
    
        def is_empty(self):
            """
            判断队列是否为空。
    
            参数:
                无。
    
            返回:
                如果队列为空则返回 True,否则返回 False。
            """
            return self.head is None
    

スレッド プールにアイドル状態のスレッドがなく、新しいタスクがスレッド リソースを要求した場合、スレッド プールはそれをどのように処理すべきでしょうか? さまざまな処理戦略はどのように実装されますか?

  • タスクリクエストを直接拒否するノンブロッキング処理方式。

  • 処理メソッドをブロックし、リクエストをキューに入れ、アイドル状態のスレッドができるまで待機し、キューに入れられたリクエストを取り出して処理を続行します。

  • キュー (配列実装またはリンク リスト実装) を使用して、キューに入れられたリクエストを格納します

    1) リンクリストの実装に基づいて、無限キューイングをサポートする無制限のキュー (アンバウンドキュー) を実装できますが、多数のリクエストが整列して待機する可能性があり、リクエスト処理の応答時間が長すぎます。したがって、応答時間に敏感なシステムの場合、リンク リストに基づいて無限にキューに入れられるスレッド プールは適していません。

    2)配列によって実装された境界付きキューに基づいて、キューのサイズが制限されるため、スレッド プール内のキューに入れられたリクエストがキュー サイズを超えると、次のリクエストは拒否されます。このメソッドは、スレッド プールの応答時間の影響を受けます。つまり、比較的合理的なシステムです。ただし、適切なキュー サイズの設定も非常に特殊です。キューが大きすぎると、待機中のリクエストが多すぎますが、キューが小さすぎると、システム リソースを十分に活用できず、パフォーマンスを最大化できません。

  • リソースが限られているほとんどのシナリオでは、アイドル状態のリソースがない場合、基本的に「キュー」のデータ構造を使用してリクエスト キューイングを実装できます。

循環キュー

  • ポイント:チームが空か満員かを判断する条件を決める
  • チーム空判定条件:先頭 == 末尾
  • チームフル判定条件:(尾+1)%n==頭
class CircularQueue:
    """
    使用列表实现的循环队列。
    属性:
        queue (list): 用于存储队列元素的列表。
        head (int): 表示队列头部索引的整数。
        tail (int): 表示队列尾部索引的整数。
        maxSize (int): 表示队列的最大大小的整数。
    """

    def __init__(self):
        """
        CircularQueue类的构造函数。

        参数:
            无。

        返回:
            无。
        """
        self.queue = []
        self.head = 0
        self.tail = 0
        self.maxSize = 8

    def enqueue(self, data):
        """
        将一个元素添加到队列中。

        参数:
            data: 要添加到队列中的数据。

        返回:
            如果元素成功添加,则返回True;如果队列已满,则返回"Queue Full!"。
        """
        # 判断队列是否已满。
        if self.size() == self.maxSize - 1:
            return "Queue Full!"

        self.queue.append(data)
        self.tail = (self.tail + 1) % self.maxSize
        return True

    def dequeue(self):
        """
        从队列中移除一个元素。

        参数:
            无。

        返回:
            如果队列不为空,则返回从队列中移除的元素;如果队列为空,则返回"Queue Empty!"。
        """
        if self.size() == 0:
            return "Queue Empty!"
        data = self.queue[self.head]
        self.head = (self.head + 1) % self.maxSize
        return data

    def size(self):
        """
        计算队列的大小。

        参数:
            无。

        返回:
            队列的大小。
        """
        if self.tail >= self.head:
            return self.tail - self.head
        return self.maxSize - (self.head - self.tail)

ブロックキュー

ブロッキング キューは、実際にはキューに基づいてブロッキング操作を追加します。キューがいっぱいの場合、挿入操作は空きができるまでブロックされ、キューが空の場合、削除操作はキュー内に削除する要素ができるまでブロックされます。ブロッキング キューは通常、マルチスレッド シナリオでのタスクのスケジューリングとコラボレーションに使用され、スレッドの実行順序と同時実行性を適切に制御し、スレッド間の競合と競合を回避できます。

  • 「プロデューサー/コンシューマー モデル」はブロッキング キューを使用して実装できます。

  • キューのブロッキングに基づいて、「プロデューサー」と「コンシューマー」の数を調整することで、データ処理の効率を向上させることもできます。

同時キュー

同時キューは、複数のスレッドによる同時アクセスをサポートするキューであり、データの不整合や同時実行性の競合を発生させることなく、複数のスレッドでキューに対する挿入や削除などの操作を同時に実行できます。

これを実現する最も簡単かつ直接的な方法は、ロックを enqueue() メソッドと dequeue() メソッドに直接追加することですが、ロックの粒度が大きい場合、同時実行性は比較的低くなり、一度に許可されるストアまたはフェッチ操作は 1 つだけになります。同じ時間です。

  • 実際、配列ベースの循環キューは、CAS アトミック操作を使用して、非常に効率的な同時キューを実現できます。

おすすめ

転載: blog.csdn.net/YuvalNoah/article/details/131033596
おすすめ