ソフトウェアアプリケーションでスタック、キュー、およびツリーを使用する場所についてはかなりよく知っていますが、Deque(Double Ended Queue)を使用したことはありません。通常、野生ではどこで遭遇しますか?キューと同じ場所にありますが、余分な不満がありますか?
ソフトウェアアプリケーションでスタック、キュー、およびツリーを使用する場所についてはかなりよく知っていますが、Deque(Double Ended Queue)を使用したことはありません。通常、野生ではどこで遭遇しますか?キューと同じ場所にありますが、余分な不満がありますか?
回答:
dequeの使用方法の1つは、アイテムを「エージング」することです。通常、元に戻す機能または履歴機能として使用されます。新しいアクションが両端キューに挿入されます。最も古いアイテムが前面にあります。dequeのサイズの制限により、新しいアイテムが挿入されると(最古のアイテムが古くなる)、ある時点で前面のアイテムが強制的に削除されます。次に、最古のアイテムと最新のアイテムを即座に把握して、O(1)でフロントを削除し、最も古いアクションをコミットするか、O(1)で元に戻すため、構造の両端にすばやくアクセスできます。
素晴らしい質問です。CS 102のコースで、両端待ち行列の単一のアプリケーションについて言及したことを思い出せません。
今日まで、私が知っている唯一のアプリケーションは、Wikipediaの記事で言及されている作品を盗むスケジューラーです。
基本的に次のように機能します。
通常のシングルスレッドプロシージャモデルでは、すべての関数呼び出しは、いわゆる呼び出しスタックにアクティベーションレコードをプッシュします。アクティベーションレコードには、その呼び出しのローカル変数とパラメーターが含まれます。メソッドの呼び出しが完了すると(「戻る」)、最後のアクティベーションレコードが呼び出しスタックからポップされます。
これは、再帰が実装される方法であるため、特に重要です。再帰の構造は、呼び出しスタックの現在の状態で表されます。
再帰アルゴリズムを並列化する場合、呼び出しスタックを呼び出しキューに置き換えることにより、このプロパティを活用できます。計算内のすべてのスレッドは、独自の呼び出しキューを取得し、順次実行のようにアクティベーションレコードをプッシュおよびポップします。
しかし、スレッドがその作業を完了すると(=呼び出しキューは空になります)、「間違った」端から削除することにより、そのスレッドの呼び出しキューからアクティベーションレコードを削除することにより、別のスレッドから作業を盗みます。
基本的に、コールキューは2つのスレッドを処理する2つのコールスタックとして機能します。