キューの良い、簡単な例は何ですか?[閉まっている]


9

私はCS2Java and data structures)を教えていますが、キューを教えるときに使用する良い例を思い付くのが困難です。私がそれらを使用する2つの主要なアプリケーションは、multithreadedメッセージパッシング(ただし、MTプログラミングはコースの範囲外です)ですBFS-style algorithms(そして、この期間の後半まではグラフを取り上げません)。

不自然な例も避けたいです。私が考えているほとんどのことは、実際にシングルスレッド方式で解決する場合は、キューではなくリストを使用するだけです。処理とディスカバリーがインターリーブされる場合(検索など)、または長さ制限のあるバッファー(最後のNアイテムを維持するなど)のような特別な場合にのみ、キューを使用する傾向があります。実用的な範囲で、私は生徒に実際のプログラムで実際に物事を行うための良い方法を教えるだけでなく、機能を披露するおもちゃだけではありません。

例として使用できるが、他の最小限の事前知識を必要とする、キューの優れたシンプルなアルゴリズムまたはアプリケーションの提案はありますか?


+1が、あなたの質問のみが含まれていることを考慮して、タグ「queue」の作成は控えます。私は「データ構造」を使用したでしょう。
K.Steff

@ K.Steff、あなたは両方を持つことができます:-)新しいタグは最初に単一の質問のみに関連付けられていることに注意してください。
ペーテルTörök

1
BFSをカバーする場合は、キューをカバーするのが自然です。それまでキューを保存しないでください。キューが線形表現を持っているからといって、リンクリストや配列リストでキューをカバーする必要はありません。
ケビンクライン

@PéterTörök私はすべてのタグが空で始まることに気づきましたが、「queue」検索では313の質問が生成され、他に「queue」タグを作成していません。とにかく、これは単なるIMOです
K.Steff

回答の繰り返し発生するテーマは、実際のキューのシミュレーションのようです。私のこれまでの考えでは、プログラミングで実際に発生する問題を解決するためにキューを使用するような例を使用したいと考えており、多くの物理世界の例は同時実行環境で最も優れています。しかし、このテーマの繰り返しを考えると、私は有用な考えに乗っていない可能性があります。今後の提案を続けてください!そして、あなたの大きな助けに感謝します。
マイケルエクストランド

回答:


14

待ち行列を学んでいるとき、教授はいつも店の例を使いました。常に1つ以上のレジスターが開いており、顧客はキューを1つまたは別のキューに入れ、そのキューを移動してすべてのアイテムを購入します。

実際には、RegisterQueueを介して顧客を移動できる単純なプログラムを実装する必要があったので、実際にプログラムを探している場合は、この例を単純で簡単なものにするだけでなく、すべての学生が実生活で見たものなどを与えることができます。それは彼らが概念をよりよく理解するのを助けるかもしれません。



1
特典(Aeroプラン)をお持ちのお客様向けに優先キューを設けることで、複雑さを増すことができます。
sixtyfootersdude 2012年

1
IMO、最も簡単な例は、私たちが人生で遭遇するものです。「ライン」の例はキューの優れた表現であり、生徒の学習に役立つはずです。実際、キューとその操作がどのように定義されているかを考えると、「ライン」の例をよく考えて、よりよく見えるようにします。
ニコラス

これは、キューイングの理論について簡単に触れられる絶好の機会でもあります。なぜ、複数のレジスタに対応する単一のラインが、レジスタあたりのラインよりも優れているのかです。シミュレーションを作成して、それを試してみましょう。Engineer Guyは素晴らしいシンプルな説明をしています:engineerguy.com/videos/video-lines.htm
jpeacock

5

キューを知ったとき、私の先生は警察のコントロールで車のラインナップを使ってキューを紹介してくれました。車を保持するキュー(「待機キュー」)があり、警官は常にキュー内の次の車を制御し、さらに検査するために同僚に送るか、車を通過させました。

非常によく使用される例は、スーパーマーケットのキューです...

生徒に例を挙げてもらいませんか?


スーパーマーケットの例では+1。私が私の答えを書いている間にあなたはそれを述べました!
マイクカプト

3

私の頭に浮かぶ一例は、例えばマクドナルドのハンバーガー加工ラインです。それらはいくつかの種類の異なるハンバーガーであり、それぞれがいくつかの異なる労働者によって生産され、それぞれが独自のキューを持っています。そこからしばらくして、準備ができたハンバーガーがFIFOの順序で、その種類のハンバーガーを注文したレジ係の1人に取られます。

したがって、複数のプロデューサーとコンシューマーがあり、各キューは制限されています。


大学でクラスメートがファストフードレジスタの配置のさまざまなスタイルをプロセッサの設計と比較したことを思い出します。1つのキューが複数のレジスターによって処理されますか?それぞれ独自のキューに登録しますか?同じライン上の複数のワーカー-スーパースカラー処理。面白かったです。

3

Amazonを例として使用することを考えました。大規模なシステムのどこかに、処理する必要のある注文のキューがあるはずです。これは、単純なエンキューとデキューで処理できます。システムは、顧客が本を購入するたびにシステム内の注文をキューに入れ、保管庫の担当者は、それを取り出してポストするためにキューから取り出します。

プライオリティキューについて話し始めるのは簡単です。プライムキューをジャンプする可能性のある主要な顧客を紹介することで、プライオリティキューを紹介できます。

どんな教科書を使っていますか?


Carrano — データ構造とJavaによる抽象化
マイケルエクストランド

2

キューの完璧な例は、口座に対する取引を処理する銀行です。通常、1日の終わりに「保留中」のトランザクションのリストが表示されます。アカウンティングが完了すると、それらのトランザクションがアカウントに適用されます。これにより、優先キューの領域に入ることができます。ほとんどの銀行は、毎晩の取引を処理する際に借方を優先するようです。そのため、保留中のクレジットを適用する前に、ドラフト手数料を上乗せすることができます。

トランザクションは、実行順にキューに挿入され、アカウンティングプロセスによってデキューされてアカウントに適用されます。


2

私は以前は通信プログラマーでしたので、これが頭に浮かびます:

カスタマーサービスホットライン。通話が着信し、通話を処理するのに十分なオペレーターがいないため、通話がキューに入れられます。次のコールが着信し、それもキューに入れられます。次に、次のオペレーターが応対可能になると、キューに入った最初の呼び出しが、使用可能なオペレーターに割り当てられます。


2

明らかな現実世界の例は、チェックアウトラインなどですが、厳密に計算に根ざした例を探しているので、ジョブスケジューリングをお勧めしますキューますか?

生徒の何人がオペレーティングシステムのクラスを受講したかはわかりませんが、すべての人がタスクマネージャーを使用して、プロセスをある時点または他の時点でチェックしたことは間違いありません。スケジューリングキューの簡単な例を紹介し、特定のサイズの「タスク」を生成(または受け入れ)、「開始」したときにFIFO順に処理するプログラムを作成するための宿題を割り当てます。

これは理解するのがかなり簡単な概念であり、キューがコンテンツを受け入れる順に処理するという考え方を示し、CPUスケジューリングの概要を(非常に初歩的で単純化された)紹介します。ちょうど私の2つのビット。

あなたは彼らのアプリケーションをマルチスレッドで立ち上げるかもしれませんが、学生がすでにスレッド化されたプログラムを書く経験を持っていない限り、私は彼らに2つイライラさせるかもしれない仕事を割り当てません。大学2年でデータ構造の学習に問題があったことを覚えています(特にJavaで、C ++を実行しておらず、ポインターについても学習していなかったため)。


1

現実の世界:

  • 人々が並んでいるときはいつでも:食料品店のレジ係、テーブルを待っているレストラン(アナロジーにときどき出されるブザーで作業することができます)など。回線の代わりにこれらのキューを呼び出す(NAで一般的)
  • 読書シリーズ '、author.publish => queue.pushおよびstudent.read => queue.pop

非現実世界:

  • 送信よりも処理に時間がかかるシングルスレッド環境で送信されたデータを処理する(オンラインストアのチェックアウト操作など)
  • 反復可能なFIFOコレクションは、キューを使用しwhile(queue.peek)、イテレーターの代わりに使用できます。

1

私はゲームを例として使用するのが好きです。なぜなら、それは一般的にファイルIOやあなたが思いつく他のものよりも少しエキサイティングだからです。

したがって、戦略ゲームのユニットに複数のコマンドを続けて発行する場合(たとえば、基地の4つのコーナーを順番に偵察するためにZerglingを使用し、次に基地の中心に自殺する場合、キューは良い選択です。 。)

または、1秒あたり30フレームしか処理できないアプリケーションがあるのに、フレーム間で4つまたは5つの入力を取得する場合があります。武器変更入力とシュート入力がある場合、それらが受信された順に処理されることを確認する必要があります。そうしないと、ナイフを使用したいときに手榴弾が発生する可能性があります。そして、ナイフを使いたいときに手榴弾を弾くと、悪い時間を過ごすことになります。(それをスキーのインストラクターのミームに入れて、スライドに入れてください):)

リクエストを処理するサーバーも良い例です。

入力を受け取るCNCマシン。マシンは非常に高速でしか実行できないため、入力をキューに入れる必要があります。


1

私が考えることができるいくつかの例:

  • 電卓-プレフィックスとポストフィックスを同時に導入できます
  • 靴を結ぶための指示。最後の操作を完了するまで、次の操作を完了できません
  • バッファ-多分、ユーザーが入力したがまだ音を出していない番号を保存するために使用される電話バッファ
  • 消化

1

製造ラインはキューでいっぱいです。充填機に向かう空のボトルのラインを考えてください。先入れ先出しは、多くのオブジェクトにプロセスを順次適用する自然な方法です。キューは、あるプロセスを別のプロセスから切り離すためにも使用されます。ラベリングマシンに短期的な問題がある場合、充填機はすぐに停止する必要はありません。

キューは、ソフトウェアでもほぼ同じ方法で使用されます。あるプロセスの出力は、別のプロセスへの入力のためにキューに入れることができます。これは、プロセス間通信、スレッド間通信、または単純に複雑なプロセスをすべて同じスレッドで処理される可能性のある部分に分割する場合に当てはまります。

オペレーティングシステムでは、キューは入力を順番に処理するためによく使用されます。たとえば、ファイルシステムはストレージデバイスからブロックを読み取り、それらをキューに追加する場合があります。または、キーの押下やマウスの動きなどを処理する割り込みにより、イベントキューに追加されるイベントが作成され、入力時に「キュー」ではなく「uqeeu」が取得されなくなります。

単純な学生の課題の場合、いくつかの入力を受け入れ、それらを処理するタスクはすべて機能すると思います。たとえば、単純な後置式エバリュエーターを作成させることができます。3つの部分があります。

  • 入力を読み取り、それを入力キューに追加し、入力がなくなるまで繰り返します。

  • キューからアイテムを取得する

    • アイテムが数値の場合、それを引数スタックにプッシュします
    • アイテムが演算子の場合、必要な引数をポップして評価します
    • 結果を出力キューに追加する
    • スタックが空になるまで繰り返します
  • 出力キューからアイテムを読み取り、それを印刷して、出力キューが空になるまで繰り返します。


1

データ構造を教える際、私は通常、顧客がキューで待機し、多数のサービスウィンドウがあるバンクキューシミュレーションのアプリケーションを使用します。

問題は、次の統計を見つけるためにプロセスをシミュレーションすることです:キューで待機している顧客(最大、最小、平均)、およびキューで待機している顧客の数。私は、事前定義された頻度で毎日1分ごとに新しい顧客に到着し、乱数発生器からの値を使用して、サービスウィンドウで顧客の平均サービス時間を使用します。

その結果、顧客満足を保証するのに最適な数のサービスウィンドウと待機ホール内の最適な数の椅子が推奨されます。学生にとって非常に興味深いアプリケーション。


1

スケジューリングアルゴリズムには、ほとんどの場合、キューが含まれます。

これは、単純な先着順のキューから、単一のコンシューマへのバッファリクエストまでさまざまです。

「タスク」に優先順位を付け、「ワーカー」に異なる機能を持たせることができる複雑なジョブスケジューリングキューに。

「中央のプリントサーバーに4つのプリンターがあり、2つはカラー印刷、もう1つは両面印刷、もう1つはより大きな用紙に印刷できます。ユーザーは、急ぎの仕事に追加料金を支払うことができます。または、彼らが長く待つことを気にしない場合は少なくなります。遅延を遅らせてできるだけ多くのスループットが必要になると、ペナルティが発生する可能性があります。」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.