web-dev-qa-db-ja.com

現実世界でDequeデータ構造が必要なのはなぜですか?

Deque データ構造が必要な状況の例を誰かに教えてもらえますか?

注-dequeとは何ですか?

47
user366312
  1. Dequeの素晴らしいアプリケーションは、Webブラウザーの履歴を保存することです。最近アクセスしたURLは両端キューの前に追加され、両端に指定された数の挿入があると、両端キューの後ろのURLが削除されます。
  2. Dequeのもう1つの一般的なアプリケーションは、ソフトウェアアプリケーションの取り消し操作のリストを格納することです。
  3. 両端キューを使用できる1つの例は、A-Stealジョブスケジューリングアルゴリズムです[5]。このアルゴリズムは、いくつかのプロセッサのタスクスケジューリングを実装します。実行されるスレッドを含む個別の両端キューは、プロセッサごとに維持されます。次のスレッドを実行するために、プロセッサは両端キューから最初の要素を取得します(「最初の要素の削除」両端キュー操作を使用)。現在のスレッドが分岐した場合、それは両端キューの前に戻され(「要素を前に挿入」)、新しいスレッドが実行されます。プロセッサの1つが独自のスレッドの実行を終了すると(つまり、両端キューが空)、スレッドは別のプロセッサからスレッドを「スチール」できます。別のプロセッサの両端キューから最後の要素を取得(「最後の要素を削除」)して実行します。それ。 -礼儀ウィキペディア
16
improgrammer

Dequeは両端のキューであり、両端から挿入および削除できます。

実際のシナリオでは、チケット購入ラインに接続できます。キューのように機能しますが、しばらくすると、一部の組織がチケットを購入し、突然キューの前に何かを要求するために戻ってきます。このシナリオでは、チケットをすでに購入しているため、来て、さらにクエリを要求する特権があります。したがって、この種のシナリオでは、要件に応じて前からデータを追加するデータ構造が必要です。同じシナリオで、ユーザーは後部からキューを離れることもできます。

したがって、それは完全にDequeのデータ構造に従います。

30
shiv.mymail

あらゆる種類の実際の待機ラインをモデル化する場合:エンティティ(ビット、人物、車、単語、パーティクルなど)は、特定の頻度でラインの終わりに到着し、ラインの始めに別の頻度で処理されます。いくつかのエンティティが待機している間、行を離れることを決定する場合があります。..など。ポイントは、行の両端で挿入/削除するための「高速アクセス」が必要であること、したがって両端キューです。

21
ric0liva

Wikipediaの例

両端キューを使用できる1つの例は、A-Stealジョブスケジューリングアルゴリズムです。このアルゴリズムは、いくつかのプロセッサのタスクスケジューリングを実装します。実行されるスレッドを含む個別の両端キューは、プロセッサごとに維持されます。次のスレッドを実行するために、プロセッサは両端キューから最初の要素を取得します(「最初の要素の削除」両端キュー操作を使用)。現在のスレッドが分岐した場合、それは両端キューの前に戻され(「要素を前に挿入」)、新しいスレッドが実行されます。プロセッサの1つが独自のスレッドの実行を終了すると(つまり、両端キューが空)、スレッドは別のプロセッサからスレッドを「スチール」できます。別のプロセッサの両端キューから最後の要素を取得(「最後の要素を削除」)して実行します。それ。

最近の C#ブックを介したCLR で、Richterは.Net 4.0でThreadPoolに加えられた改善について説明しています。特に仕事を盗むことについては、間違いなく読む価値があります。 Richterによって記述されたアルゴリズムは、Wikipediaの例と非常によく似ているので、Dequeもそこで使用されていると思います。

7

http://en.wikipedia.org/wiki/Deque は、両端キューを使用するジョブスケジューリングアルゴリズムがあると述べています。ドイツ語のウィキペディアのページ(http://de.wikipedia.org/wiki/Deque)では、パターンマッチングアルゴリズムと、dequeの使用例としての非決定的有限状態マシンの実装について言及しています。

2
jens

Dequeは、車がラインの左側または右側に出入りできる駅をモデル化できますが、出入りできるのは端の車だけです。これは、内側の車が外側の車にぶつかって離れることができないため、待機する必要があるためです。

1
thegenie

「キュー」は、2つのデータ構造のいずれかを使用して実装できます。

  1. リンクされたリスト-端でのみ作業していて、メモリ割り当てのオーバーヘッドを気にしない(またはメモリの割り当て方法に制約がある)場合、これは理にかなっています。
  2. deque-両端で作業する場合、位置アクセスも必要です(またはキュー内のアイテムをすばやく反復する機能)。メモリ割り当てのオーバーヘッドが重要です(ただし、制約はありません)。次に、dequeは両方のベスト(割り当てのようなベクトル)を提供します。リンクされたリストのような機能-まあ、とにかく、途中で挿入する方が高価です)

通常、両端キューは優先キューイングに役立ちます。キューのスキャンは、両端キューの方がリンクリストよりもはるかに高速です。

0
Nim

イテレータをチェーンする場合の実用的な使用例があります。 拡張可能なイテレータ を実装するためにそれを使用しました:

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);
        }
    }
}
0
Reut Sharabani