そしてPythonでは
deque は Double-Ended Queue の略です。これは、両端から要素を効率的に追加および削除できる特別なタイプのデータ構造です。
通常のキュー (通常は先入れ先出しに従います) とは異なり、デキューは FIFO 操作と LIFO 操作の両方をサポートします。これにより、タスク スケジューリング スライディング ウィンドウの問題やリアルタイム データ処理など、現実世界のアプリケーションで非常に柔軟で便利になります。
例:
Python from collections import deque # Declaring deque de = deque ([ 'name' 'age' 'DOB' ]) print ( de )
出力
deque(['name' 'age' 'DOB'])
なぜデックが必要なのか
- 両端からの要素の追加/削除にかかる時間は O(1) です。
- フロントエンド操作ではリストよりも効率的です。
- キュー (FIFO) とスタック (LIFO) の両方として機能します。
- スライディング ウィンドウ問題やリアルタイム データ処理のスケジュール設定に最適です。
- 次のような強力な組み込みメソッドを提供します。 appendleft() ポップレフト() そして 回転()。
制限付きデキュー入力のタイプ
- 入力制限されたデキュー : 入力は一方の端で制限されていますが、削除は両端で許可されています。
- 出力制限付きデキュー : 出力は一端で制限されますが、両端での挿入は許可されます。
デックに対する操作
以下の表は、Python の両端キューの組み込み操作と、その説明および対応する時間計算量をリストしたものです。
| 手術 | 説明 | 時間計算量 |
|---|---|---|
| 追加(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])