Deque データ構造が必要な状況の例を誰かに教えてもらえますか?
注-deque
とは何ですか?
Dequeは両端のキューであり、両端から挿入および削除できます。
実際のシナリオでは、チケット購入ラインに接続できます。キューのように機能しますが、しばらくすると、一部の組織がチケットを購入し、突然キューの前に何かを要求するために戻ってきます。このシナリオでは、チケットをすでに購入しているため、来て、さらにクエリを要求する特権があります。したがって、この種のシナリオでは、要件に応じて前からデータを追加するデータ構造が必要です。同じシナリオで、ユーザーは後部からキューを離れることもできます。
したがって、それは完全にDequeのデータ構造に従います。
あらゆる種類の実際の待機ラインをモデル化する場合:エンティティ(ビット、人物、車、単語、パーティクルなど)は、特定の頻度でラインの終わりに到着し、ラインの始めに別の頻度で処理されます。いくつかのエンティティが待機している間、行を離れることを決定する場合があります。..など。ポイントは、行の両端で挿入/削除するための「高速アクセス」が必要であること、したがって両端キューです。
両端キューを使用できる1つの例は、A-Stealジョブスケジューリングアルゴリズムです。このアルゴリズムは、いくつかのプロセッサのタスクスケジューリングを実装します。実行されるスレッドを含む個別の両端キューは、プロセッサごとに維持されます。次のスレッドを実行するために、プロセッサは両端キューから最初の要素を取得します(「最初の要素の削除」両端キュー操作を使用)。現在のスレッドが分岐した場合、それは両端キューの前に戻され(「要素を前に挿入」)、新しいスレッドが実行されます。プロセッサの1つが独自のスレッドの実行を終了すると(つまり、両端キューが空)、スレッドは別のプロセッサからスレッドを「スチール」できます。別のプロセッサの両端キューから最後の要素を取得(「最後の要素を削除」)して実行します。それ。
最近の C#ブックを介したCLR で、Richterは.Net 4.0でThreadPoolに加えられた改善について説明しています。特に仕事を盗むことについては、間違いなく読む価値があります。 Richterによって記述されたアルゴリズムは、Wikipediaの例と非常によく似ているので、Dequeもそこで使用されていると思います。
http://en.wikipedia.org/wiki/Deque は、両端キューを使用するジョブスケジューリングアルゴリズムがあると述べています。ドイツ語のウィキペディアのページ(http://de.wikipedia.org/wiki/Deque)では、パターンマッチングアルゴリズムと、dequeの使用例としての非決定的有限状態マシンの実装について言及しています。
Dequeは、車がラインの左側または右側に出入りできる駅をモデル化できますが、出入りできるのは端の車だけです。これは、内側の車が外側の車にぶつかって離れることができないため、待機する必要があるためです。
「キュー」は、2つのデータ構造のいずれかを使用して実装できます。
通常、両端キューは優先キューイングに役立ちます。キューのスキャンは、両端キューの方がリンクリストよりもはるかに高速です。
イテレータをチェーンする場合の実用的な使用例があります。 拡張可能なイテレータ を実装するためにそれを使用しました:
import Java.util.Deque;
import Java.util.Iterator;
import Java.util.concurrent.ConcurrentLinkedDeque;
public class ExtendableIterator<T> implements Iterator<T> {
public Deque<Iterator<T>> its = new ConcurrentLinkedDeque<Iterator<T>>();
public ExtendableIterator() {
}
public ExtendableIterator(Iterator<T> it) {
this();
this.extend(it);
}
@Override
public boolean hasNext() {
// this is true since we never hold empty iterators
return !its.isEmpty() && its.peekLast().hasNext();
}
@Override
public T next() {
T next = its.peekFirst().next();
if (!its.peekFirst().hasNext()) {
its.removeFirst();
}
return next;
}
public void extend(Iterator<T> it) {
if (it.hasNext()) {
its.addLast(it);
}
}
}