Was sind einige gute, einfache Beispiele für Warteschlangen? [geschlossen]


9

Ich unterrichte CS2 ( Java and data structures) und habe einige Schwierigkeiten, gute Beispiele für das Unterrichten von Warteschlangen zu finden. Die beiden Hauptanwendungen, für die ich sie verwende, sind das multithreadedWeiterleiten von Nachrichten (aber die MT-Programmierung ist für den Kurs nicht möglich) und BFS-style algorithms(und ich werde Diagramme erst später im Semester behandeln).

Ich möchte auch erfundene Beispiele vermeiden. Die meisten Dinge, an die ich denke, wenn ich sie tatsächlich in einem einzigen Thread lösen würde, würde ich nur eine Liste anstelle einer Warteschlange verwenden. Ich verwende Warteschlangen normalerweise nur, wenn Verarbeitung und Ermittlung verschachtelt sind (z. B. Suche) oder in anderen Sonderfällen wie längenbegrenzte Puffer (z. B. Beibehalten der letzten N Elemente). Soweit es praktisch ist, versuche ich meinen Schülern gute Möglichkeiten beizubringen, Dinge in echten Programmen zu tun, nicht nur Spielzeug, um eine Funktion zu demonstrieren.

Irgendwelche Vorschläge für gute, einfache Algorithmen oder Anwendungen von Warteschlangen, die ich als Beispiele verwenden kann, für die jedoch ein Minimum an anderen Vorkenntnissen erforderlich ist?


+1, aber ich würde es unterlassen, das Tag 'queue' zu erstellen, da es nur Ihre Frage enthält. Ich hätte 'Datenstrukturen' verwendet.
K.Steff

@ K.Steff, Sie können beides haben :-) Beachten Sie, dass jedes neue Tag am Anfang nur einer einzigen Frage zugeordnet ist.
Péter Török

1
Es ist natürlich, Warteschlangen abzudecken, wenn Sie BFS abdecken. Warum nicht bis dahin Warteschlangen speichern? Sie müssen Warteschlangen nicht mit verknüpften Listen und Array-Listen abdecken, nur weil sie auch eine lineare Darstellung haben.
Kevin Cline

@ PéterTörök Mir ist klar, dass alle Tags leer beginnen, aber eine Suche in der Warteschlange ergibt 313 Fragen, und kein anderer hat das Tag in der Warteschlange erstellt. Dies ist sowieso nur IMO
K.Steff

Ein wiederkehrendes Thema in den Antworten scheint die Simulation realer Warteschlangen zu sein. Bisher habe ich gedacht, dass ich lieber Beispiele für Dinge verwenden würde, bei denen ich eine Warteschlange verwenden würde, um ein Problem zu lösen, das tatsächlich beim Programmieren auftritt, und dass viele Beispiele aus der physischen Welt in gleichzeitigen Umgebungen am besten leuchten. Angesichts der Wiederholung dieses Themas könnte es jedoch durchaus sein, dass ich nicht in einer nützlichen Denkrichtung bin. Halten Sie die Vorschläge kommen! Und vielen Dank für Ihre großartige Hilfe.
Michael Ekstrand

Antworten:


14

Wenn ich Warteschlangen lernte, verwendete mein Professor immer das Beispiel eines Geschäfts. Es sind zu einem bestimmten Zeitpunkt mindestens ein Register geöffnet, und die Kunden betreten die eine oder andere Warteschlange und gehen durch diese Warteschlange, um alle ihre Artikel zu kaufen.

Wir mussten tatsächlich ein einfaches Programm implementieren, mit dem Kunden durch eine RegisterQueue geführt werden können. Wenn Sie also tatsächlich nach einem Programm suchen, können Sie den Schülern dieses Beispiel geben, das einfach und unkompliziert ist, aber auch etwas, das jeder Schüler im wirklichen Leben gesehen hat es kann ihnen helfen, das Konzept besser zu verstehen.


Wie gesagt, dieses Beispiel ist sowohl sehr intuitiv als auch fast zu oft verwendet;)
marktani

1
Sie können die Komplexität erhöhen, indem Sie eine Prioritätswarteschlange für Kunden mit Vergünstigungen einrichten (Aero-Plan).
Sixtyfootersdude

1
IMO, die einfachsten Beispiele sind die, denen wir im Leben begegnen. Ein "Linien" -Beispiel ist eine hervorragende Darstellung einer Warteschlange und soll Ihren Schülern beim Lernen helfen. Wenn ich an Warteschlangen denke und wie ihre Operationen definiert sind, denke ich oft an das Beispiel "Linie", um es besser sichtbar zu machen.
Nicholas

Dies ist auch eine großartige Gelegenheit, kurz auf die Warteschlangentheorie einzugehen: Warum eine einzelne Leitung, die mehrere Register bedient, besser ist als eine Leitung pro Register. Lassen Sie sie eine Simulation erstellen und damit spielen. Der Engineer Guy hat eine großartige, einfache Erklärung: engineerguy.com/videos/video-lines.htm
jpeacock

5

Als ich Warteschlangen lernte, stellte mein Lehrer sie mir mit einer Aufstellung für Autos bei einer Polizeikontrolle vor. Es gab eine Warteschlange mit den Autos ("Warteschlange"), und der Polizist kontrollierte immer das nächste Auto in der Warteschlange und schickte es entweder zur weiteren Inspektion an seinen Kollegen oder ließ das Auto passieren.

Ein sehr häufig verwendetes Beispiel ist die Warteschlange im Supermarkt ...

Warum bitten Sie Ihre Schüler nicht, selbst einige Beispiele zu nennen?


+1 für Supermarktbeispiel. Du hast es erwähnt, als ich meine Antwort aufschrieb!
Mike Caputo

3

Ein Beispiel, das mir in den Sinn kommt, ist eine Hamburger-Verarbeitungslinie in z. B. McDonalds. Es gibt verschiedene Arten von Burgern, jeder kann von mehreren verschiedenen Arbeitern hergestellt werden und jeder hat seine eigene Warteschlange. Von dort werden nach einer Weile die fertigen Burger in FIFO-Reihenfolge von einem der Kassierer genommen, die diese Art von Burger bestellt haben.

Es gibt also mehrere Produzenten und Konsumenten, und jede Warteschlange ist begrenzt.


Ich erinnere mich an Klassenkameraden im College, die die verschiedenen Arten von Fast-Food-Registern mit Prozessordesigns verglichen haben. Eine Warteschlange, die von mehreren Registern verwaltet wird? Jedes Register mit einer eigenen Warteschlange? Mehrere Mitarbeiter in derselben Zeile - superskalare Verarbeitung. Es war amüsant.

3

Ich dachte darüber nach, Amazon als Beispiel zu verwenden. Irgendwo in ihrem riesigen System muss es eine Warteschlange mit Bestellungen geben, die bearbeitet werden müssen. was durch eine einfache Warteschlange und Warteschlange behandelt werden könnte. Das System stellte jedes Mal, wenn ein Kunde ein Buch kaufte, eine Bestellung in das System ein, und eine Person aus dem Lagerhaus stellte es dann in die Warteschlange, um es auszuwählen und zu buchen.

Es wäre dann einfach, über Prioritätswarteschlangen zu sprechen, indem Sie Hauptkunden einführen, die möglicherweise in die Warteschlange springen, und Prioritätswarteschlangen einführen.

Welches Lehrbuch benutzt du?


Carrano - Datenstrukturen und Abstraktion mit Java .
Michael Ekstrand

2

Ein perfektes Beispiel für eine Warteschlange wäre eine Bank, die Transaktionen für ein Konto verarbeitet. Normalerweise wird am Ende des Tages eine Liste der "ausstehenden" Transaktionen angezeigt. Wenn die Abrechnung abgeschlossen ist, werden diese Transaktionen auf das Konto angewendet. Damit könnten Sie sogar in den Bereich der Prioritätswarteschlangen gelangen. Es scheint, dass die meisten Banken bei der Abwicklung nächtlicher Transaktionen den Belastungen Vorrang einräumen, damit sie Sie mit Gebührenüberschüssen belasten können, bevor sie ausstehende Kredite beantragen.

Die Transaktionen werden in der Reihenfolge der ausgeführten und in die Warteschlange gestellten Zeit in die Warteschlange eingefügt und vom Abrechnungsprozess auf das Konto angewendet.


2

Ich war früher ein Telekommunikationsprogrammierer, daher fällt mir Folgendes ein:

Eine Kundendienst-Hotline. Ein Anruf kommt herein, es gibt nicht genügend Operatoren, um den Anruf zu bearbeiten, und er wird in eine Warteschlange gestellt. Der nächste Anruf kommt herein und wird ebenfalls in die Warteschlange gestellt. Wenn dann der nächste Operator verfügbar wird, wird der erste Anruf, der in die Warteschlange eingetreten ist, dem verfügbaren Operator zugewiesen.


2

Die offensichtlichen Beispiele aus der Praxis wären Dinge wie Kassen und dergleichen. Da Sie jedoch nach einem Beispiel suchen, das ausschließlich im Computerbereich verwurzelt ist, kann ich Ihnen Warteschlangen für die Auftragsplanung vorschlagen ?

Ich weiß nicht, wie viele Ihrer Schüler an einem Betriebssystemkurs teilgenommen haben, aber es ist eine gute Wette, dass alle den Task-Manager verwendet haben , um ihre Prozesse irgendwann zu überprüfen. Sie können ein vereinfachtes Beispiel für eine Planungswarteschlange einführen und ihnen einige Hausaufgaben zuweisen, um ein Programm zu schreiben, das eine "Aufgabe" einer bestimmten Größe generiert (oder akzeptiert), und sie in FIFO-Reihenfolge verarbeiten, wenn sie "gestartet" werden.

Es ist ein ziemlich einfach zu verstehendes Konzept, das die Idee demonstriert, dass die Warteschlange ihren Inhalt in der Reihenfolge bearbeitet, in der sie akzeptiert wird, und ihnen eine (sehr rudimentäre und vereinfachte) Einführung in die CPU-Planung gibt. Nur meine zwei Bits.

Sie könnten ihre Anwendung im Multithreading aufrufen, aber wenn die Schüler nicht bereits Erfahrung mit dem Schreiben von Thread-Programmen haben, würde ich ihnen keine Arbeit zuweisen, die zwei frustrierend werden könnte. Ich erinnere mich, dass ich in meinem zweiten Studienjahr Probleme beim Erlernen von Datenstrukturen hatte (insbesondere in Java, nachdem ich C ++ nicht gelernt und nichts über Zeiger gelernt hatte). Daher ist ein einfaches, aber praktisches Beispiel, das in direktem Zusammenhang mit dem Rechnen steht, wahrscheinlich das Beste.


1

Echte Welt:

  • Jedes Mal, wenn sich Leute anstellen: Kassierer im Lebensmittelgeschäft, im Restaurant, das auf einen Tisch wartet (Sie können in den Pieptönen arbeiten, die sie manchmal in der Analogie ausgeben) usw. Es ist hilfreich, wenn Sie feststellen, dass sie in Großbritannien häufig auftreten Rufen Sie diese Warteschlangen anstelle von Zeilen auf (häufig in NA).
  • Buchreihe lesen ', author.publish => queue.push und student.read => queue.pop

Nicht-reale Welt:

  • Verarbeiten von übermittelten Daten in einer Single-Threaded-Umgebung, in der die Verarbeitung länger dauert als die Übermittlung (Checkout-Vorgänge für Online-Shops, z.
  • Jede FIFO-Sammlung, über die iteriert werden kann, kann Warteschlangen verwenden und while(queue.peek)anstelle eines Iterators verwenden.

1

Ich verwende gerne Spiele als Beispiel, weil es im Allgemeinen etwas aufregender ist als Datei-E / A oder was auch immer Sie sich sonst noch einfallen lassen können.

Wenn Sie also in einem Strategiespiel mehrere Befehle hintereinander an eine Einheit senden möchten (z. B. einen Zergling, um 4 Ecken einer Basis in der richtigen Reihenfolge zu erkunden, und dann Selbstmord in die Mitte der Basis, ist eine Warteschlange eine gute Wahl .)

Oder Sie haben eine Anwendung, die nur 30 Bilder pro Sekunde verarbeiten kann, aber möglicherweise 4 oder 5 Eingaben zwischen den Bildern erhält. Wenn Sie einen Wechselwaffeneingang und einen Schießeingang haben, möchten Sie sicherstellen, dass diese in der Reihenfolge behandelt werden, in der sie empfangen wurden. Andernfalls können Sie Granaten verwenden, wenn Sie Messer möchten. Und wenn Sie Granate, wenn Sie Messer wollen, werden Sie eine schlechte Zeit haben. (Lege das auf das Mem des Skilehrers und wirf es in deine Folien) :)

Ein Server, der Anfragen bearbeitet, ist ebenfalls gut.

Eine CNC-Maschine, die Eingaben übernimmt. Die Maschine kann nur so schnell fahren, dass Eingaben in die Warteschlange gestellt werden müssen.


1

Einige Beispiele, die mir einfallen:

  • Rechner - kann Präfix und Postfix gleichzeitig einführen
  • Anleitung zum Binden von Schuhen. Der nächste Vorgang kann erst abgeschlossen werden, wenn Sie den letzten ausgeführt haben
  • Puffer - Möglicherweise ein Telefonpuffer zum Speichern von Nummern, die der Benutzer eingegeben hat, aber den Ton noch nicht ausgegeben hat
  • Verdauung

1

Fertigungslinien sind voller Warteschlangen. Stellen Sie sich eine Reihe leerer Flaschen vor, die auf eine Abfüllmaschine zusteuern. First-in-first-out ist eine natürliche Methode, um einen Prozess nacheinander auf viele Objekte anzuwenden. Warteschlangen werden auch verwendet, um einen Prozess von einem anderen zu entkoppeln: Die Abfüllmaschine muss nicht sofort anhalten, wenn ein kurzfristiges Problem mit der Etikettiermaschine vorliegt.

Warteschlangen werden in Software auf ungefähr die gleiche Weise verwendet. Die Ausgabe eines Prozesses kann zur Eingabe in einen anderen Prozess in die Warteschlange gestellt werden. Dies gilt unabhängig davon, ob Sie über prozessübergreifende Kommunikation oder Kommunikation zwischen Threads sprechen oder einfach einen komplizierten Prozess in Teile aufteilen, die möglicherweise alle von demselben Thread verarbeitet werden.

In Betriebssystemen werden häufig Warteschlangen verwendet, um Eingaben der Reihe nach zu verarbeiten. Das Dateisystem liest möglicherweise Blöcke von einem Speichergerät und fügt sie beispielsweise einer Warteschlange hinzu. Oder Interrupts, die beispielsweise Tastendrücke und Mausbewegungen ausführen, erzeugen Ereignisse, die einer Ereigniswarteschlange hinzugefügt werden, sodass Sie beim Tippen nicht "uqeeu" anstelle von "queue" erhalten.

Für eine einfache Schüleraufgabe denke ich, dass jede Aufgabe, die eine bestimmte Anzahl von Eingaben akzeptiert und diese dann verarbeitet, funktionieren würde. Sie können sie beispielsweise einen einfachen Postfix-Ausdrucksauswerter schreiben lassen. Es hätte drei Teile:

  • Lesen Sie eine Eingabe, fügen Sie sie der Eingabewarteschlange hinzu und wiederholen Sie den Vorgang, bis keine Eingaben mehr vorhanden sind

  • Holen Sie sich einen Artikel aus der Warteschlange

    • Wenn das Element eine Zahl ist, schieben Sie es auf den Argumentstapel
    • Wenn das Element ein Operator ist, geben Sie die erforderlichen Argumente ein und werten Sie es aus
    • Fügen Sie das Ergebnis zur Ausgabewarteschlange hinzu
    • Wiederholen, bis der Stapel leer ist
  • Lesen Sie ein Element aus der Ausgabewarteschlange, drucken Sie es aus und wiederholen Sie den Vorgang, bis die Ausgabewarteschlange leer ist


1

Beim Unterrichten von Datenstrukturen verwende ich normalerweise die Anwendung der Bankwarteschlangensimulation, bei der Kunden in einer Warteschlange warten und es eine Reihe von Servicefenstern gibt.

Das Problem besteht darin, den Prozess zu simulieren, um Statistiken über Folgendes zu erhalten: Wartezeit der Kunden in der Warteschlange (max, min, Durchschnitt) und Anzahl der in der Warteschlange wartenden Kunden. Ich verwende eine vordefinierte Häufigkeit, mit der jede Minute eines Tages ein neuer Kunde ankommt, und eine durchschnittliche Servicezeit eines Kunden im Servicefenster mit Werten aus dem Zufallszahlengenerator.

Das Ergebnis sind Empfehlungen für die optimale Anzahl von Servicefenstern und die optimale Anzahl von Stühlen in der Wartehalle, die die Kundenzufriedenheit garantieren würden. Sehr interessante Anwendung für Studenten.


1

Jeder Planungsalgorithmus beinhaltet fast immer eine Warteschlange.

Dies kann von einer einfachen Warteschlange "Wer zuerst kommt, mahlt zuerst" bis zur Pufferanforderung für einen einzelnen Verbraucher reichen.

Zu einer komplexen Jobplanungswarteschlange, in der "Aufgaben" Prioritäten haben können und "Mitarbeiter" unterschiedliche Funktionen haben.

Ein guter Anwendungsfall zum Herumspielen könnte sein: "Sie haben einen zentralen Druckserver mit vier angeschlossenen Druckern, von denen zwei farbfähig, einer doppelseitig und einer auf größerem Papier drucken können. Benutzer können für einen Eilauftrag extra bezahlen. oder weniger, wenn es ihnen nichts ausmacht, länger zu warten. Sie können Strafen verhängen, wenn Sie zu spät liefern, damit Sie so viel Durchsatz wie möglich erzielen. "

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.