deque は Double-Ended Queue の略です。これは、両端から要素を効率的に追加および削除できる特別なタイプのデータ構造です。
通常のキュー (通常は先入れ先出しに従います) とは異なり、デキューは FIFO 操作と LIFO 操作の両方をサポートします。これにより、タスク スケジューリング スライディング ウィンドウの問題やリアルタイム データ処理など、現実世界のアプリケーションで非常に柔軟で便利になります。
例:
Pythonfrom collections import deque # Declaring deque de = deque(['name''age''DOB']) print(de)
出力
deque(['name' 'age' 'DOB'])

なぜデックが必要なのか
- 両端からの要素の追加/削除にかかる時間は O(1) です。
- フロントエンド操作ではリストよりも効率的です。
- キュー (FIFO) とスタック (LIFO) の両方として機能します。
- スライディング ウィンドウ問題やリアルタイム データ処理のスケジュール設定に最適です。
- 次のような強力な組み込みメソッドを提供します。 appendleft() ポップレフト() そして 回転()。
制限付きデキュー入力のタイプ
- 入力制限されたデキュー : 入力は一方の端で制限されていますが、削除は両端で許可されています。
- 出力制限付きデキュー : 出力は一端で制限されますが、両端での挿入は許可されます。
デックに対する操作
以下の表は、Python の両端キューの組み込み操作と、その説明および対応する時間計算量をリストしたものです。
arpコマンド
| 手術 | 説明 | 時間計算量 |
|---|---|---|
| 追加(x) | 追加しますx両端子キューの右端に。 | ○(1) |
| 左に追加(x) | 追加しますx両端子キューの左端に。 | ○(1) |
| ポップ() | 両端キューの右端から要素を削除して返します。 | ○(1) |
| ポップレフト() | 両端キューの左端から要素を削除して返します。 | ○(1) |
| 拡張(反復可能) | すべての要素を追加しますiterable両端子キューの右端に。 | 大丈夫) |
| extendleft(反復可能) | すべての要素を追加しますiterable両端キューの左端に移動します (順序が逆)。 | 大丈夫) |
| 削除(値) | 最初に出現したものを削除しますvalueデクから。レイズValueError見つからない場合。 | の上) |
| 回転(n) | デキューをローテーションしますn右へのステップ。もしn負の場合は左に回転します。 | 大丈夫) |
| クリア() | 両端キューからすべての要素を削除します。 | の上) |
| カウント(値) | の出現回数をカウントします。valueデクで。 | の上) |
| インデックス(値) | 最初に出現したインデックスを返します。valueデクで。レイズValueError見つからない場合。 | の上) |
| 逆行する() | 両端キューの要素をその場で反転します。 | の上) |
デキュー項目の追加と削除
- 追加(x): x を両端キューの右端に追加します。
- 追加左(x): 両端キューの左端に x を追加します。
- 拡張(反復可能): 反復可能な要素から右端までのすべての要素を追加します。
- extendleft(反復可能): すべての要素を反復可能要素から左端まで (逆の順序で) 追加します。
- 削除(値): 指定された値の最初の出現を両端キューから削除します。値が見つからない場合は、ValueError が発生します。
- ポップ(): 右端から要素を削除して返します。
- ポップレフト(): 左端から要素を削除して返します。
- クリア(): 両端キューからすべての要素を削除します。
from collections import deque dq = deque([10 20 30]) # Add elements to the right dq.append(40) # Add elements to the left dq.appendleft(5) # extend(iterable) dq.extend([50 60 70]) print('After extend([50 60 70]):' dq) # extendleft(iterable) dq.extendleft([0 5]) print('After extendleft([0 5]):' dq) # remove method dq.remove(20) print('After remove(20):' dq) # Remove elements from the right dq.pop() # Remove elements from the left dq.popleft() print('After pop and popleft:' dq) # clear() - Removes all elements from the deque dq.clear() # deque: [] print('After clear():' dq)
出力:
After extend([50 60 70]): deque([5 10 20 30 40 50 60 70])
After extendleft([0 5]): deque([5 0 5 10 20 30 40 50 60 70])
After remove(20): deque([5 0 5 10 30 40 50 60 70])
After pop and popleft: deque([0 5 10 30 40 50 60])
After clear(): deque([])
アイテムへのアクセスと両端キューの長さ
- インデックス作成: 正または負のインデックスを使用して、位置によって要素にアクセスします。
- のみ(): 両端キュー内の要素の数を返します。
import collections dq = collections.deque([1 2 3 3 4 2 4]) # Accessing elements by index print(dq[0]) print(dq[-1]) # Finding the length of the deque print(len(dq))
出力
1 4 7
デックの回転と反転をカウントする
- カウント(値): このメソッドは、両端キュー内の特定の要素の出現数をカウントします。
- 回転(n): このメソッドは、両端キューを n ステップずつ回転させます。正の n は右に回転し、負の n は左に回転します。
- 逆行する(): このメソッドは、両端キュー内の要素の順序を逆にします。
from collections import deque # Create a deque dq = deque([10 20 30 40 50 20 30 20]) # 1. Counting occurrences of a value print(dq.count(20)) # Occurrences of 20 print(dq.count(30)) # Occurrences of 30 # 2. Rotating the deque dq.rotate(2) # Rotate the deque 2 steps to the right print(dq) dq.rotate(-3) # Rotate the deque 3 steps to the left print(dq) # 3. Reversing the deque dq.reverse() # Reverse the deque print(dq)
出力
3 2 deque([30 20 10 20 30 40 50 20]) deque([20 30 40 50 20 30 20 10]) deque([10 20 30 20 50 40 30 20])