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 multithreaded
Weiterleiten 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?
quelle
Antworten:
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.
quelle
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?
quelle
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.
quelle
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?
quelle
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.
quelle
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.
quelle
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.
quelle
Echte Welt:
Nicht-reale Welt:
while(queue.peek)
anstelle eines Iterators verwenden.quelle
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.
quelle
Einige Beispiele, die mir einfallen:
quelle
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
Lesen Sie ein Element aus der Ausgabewarteschlange, drucken Sie es aus und wiederholen Sie den Vorgang, bis die Ausgabewarteschlange leer ist
quelle
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.
quelle
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. "
quelle