キューとスタック

18106 ワード

キュー

  • キューは非常に有名なデータ構造
  • であり、それは先入先出(FIFO)に基づいている.
  • キューは追加順にデータを削除できるため、ストリーム(streaming)、幅優先検索(breath first search)などのソフトウェア開発において広く応用されている.
  • FIFOQueue:First In First Out=先入先出
  • LIFO Queue:Last In Last Out=後入先出
  • 次の例ではpythonのlist「後方および前方の構造」を使用します。

    >>> queue = []
    >>> queue.append(4)
    >>> queue.append(5)
    >>> queue.append(6)
    >>> queue.append(7)
    >>> queue.append(8)
    >>> queue
    [4, 5, 6, 7, 8]
    >>> queue.pop(0)
    4
    >>> queue.pop(0)
    5
    >>> queue
    [6, 7, 8]

    次の例ではpythonのlist「前後の構造」を使用します。

    >>> queue = [4, 5, 6]
    >>> queue.insert(0, 3)
    >>> queue.insert(0, 2)
    >>> queue
    [2, 3, 4, 5, 6]
    >>> queue.pop()
    6
    >>> queue.pop()
    5
    >>> queue
    [2, 3, 4]
  • は、パフォーマンスの面でlistを使用してキューリソース構造の効果を実現することを推奨しない.Pythonのlistはランダムアクセス(random access)のために最適化されたデータ構造であるため、pop(0)またはinsert(0,x)は性能的に非常に不利である.この2つの演算の時間的複雑度はO(N)であるため,含まれるデータが多ければ多いほど速度が遅くなる.最初のデータを削除した後、後ろのすべてのデータを前に1つ引いてから、すべてのデータを後ろに1つ押して、一番前にデータを挿入する必要があります.
  • collectionsモジュールのdeque

  • CollectionsモジュールのDequeは、データを双方向に追加および削除するための両端キューの略である
  • .
  • Dequeは、リストにないpopleft()メソッドを提供する.この方法を使用して、最初のデータを削除します.リストオブジェクトのpop(0)メソッドを使用するように、データストリームは後方から前方に流れる.
    >>> from collections import deque
    >>>
    >>> queue = deque([4, 5, 6])
    >>> queue.append(7)
    >>> queue.append(8)
    >>> queue
    deque([4, 5, 6, 7, 8])
    >>> queue.popleft()
    4
    >>> queue.popleft()
    5
    >>> queue
    deque([6, 7, 8])
  • Dequeはappendleft(x)という方法も提供している.この方法では、一番前にデータを挿入できます.この場合、データストリームはlistオブジェクトのinsert(0,x)メソッドを使用するように前後に流れます.
  • >>> from collections import deque
    >>>
    >>> queue = deque([4, 5, 6])
    >>> queue.appendleft(3)
    >>> queue.appendleft(2)
    >>> queue
    deque([2, 3, 4, 5, 6])
    >>> queue.pop()
    6
    >>> queue.pop()
    5
    >>> queue
    deque([2, 3, 4])
  • Dequeのpopleft()およびappendleft(x)メソッドはいずれもO(1)の時間的複雑さを有するため、上記リストのpop(0)およびinsert(0,x)の性能上の利点は非常に大きい.
  • ですが、すべての資料構造が示すようにDequeにも欠点があります.ランダムアクセス(random access)の時間的複雑さはO(N)である.内部ではlinklistを使用しているので、iデータにアクセスするには、前から後までiサイクル(反復)を行う必要があります.
  • Queueモジュール内のQueueクラス

  • この方法は主にマルチスレッド環境に使用され、内部ではロックがサポートされ、複数のスレッドが同時にデータを追加または削除できるようにします.
  • dequeとは異なり、方向性がないため、データを追加および削除する方法は単一です.したがって、データを追加するにはput(x) 메서드を使用し、データを削除するにはget() 메서드を使用します.
  • >>> from queue import Queue
    >>>
    >>> que = Queue()
    >>> que.put(4)
    >>> que.put(5)
    >>> que.put(6)
    >>> que.get()
    4
    >>> que.get()
    5
    >>> que.get()
    6

    スタック


  • データの追加と削除は一方向の構造
  • である.
  • スタックにもストレージ領域の制限があり、スタック内のデータがいっぱいになった場合、データを追加しようとすると問題が発生します.
  • スタックオーバーフロー:フルスタックでPUSHを使用する場合、
  • スタック底流:スタックが空の場合、POPは
  • pythonではlistをappend()、pop()スタックとして使用できます

    >>> queue = []
    >>> queue.append(4)
    >>> queue.append(5)
    >>> queue.append(6)
    >>> queue.append(7)
    >>> queue.append(8)
    >>> queue
    [4, 5, 6, 7, 8]
    >>> queue.pop()
    8
    >>> queue.pop()
    7
    >>> queue
    [4, 5, 6]

    References

  • https://www.daleseo.com/python-queue/
  • https://blog.tomclansys.com/69?category=1066976