Bag / Multimenge (Algorithmus 1.4)
Die Multimenge als Kette aus Sedgewick/Wayne, Algorithmus 1.4 (Listing 1.42) – hineinlegen mit add und durchlaufen mit dem Iterator, Schritt für Schritt bis zu Mittelwert und Standardabweichung, mit Java-Code und Protokoll.
So geht’s: Oben eine Zahl mit add in den Bag legen oder eine Zufallszahl nehmen. add sieht genauso aus wie push beim Stapel. Herausnehmen kann man nichts, nur durchlaufen: „for (x : bag)“ zeigt den Iterator, wie aktuell von first über next wandert. „Mittelwert & Standardabweichung“ ist der typische Anwendungsfall: Ein kleiner Client läuft zweimal über alle Werte, einmal für die Summe, einmal für die Abweichungen, und man sieht die Zwischensumme Knoten für Knoten. Die „Beispielwerte“ sind zehn Messwerte, „↺ Neu starten“ setzt alles zurück.
Erklärung
Bag / Multimenge (Algorithmus 1.4). Die einfachste der vier Strukturen: Man kann Elemente hineinwerfen und alle durchlaufen, aber nichts gezielt herausnehmen. Die Reihenfolge spielt keine Rolle, Duplikate sind erlaubt.
Aufbau:
- Verkettete Liste wie beim Stapel [15], nur
first. add(item)ist Wort für Wortpush(): neuer Knoten vorne dran.- Kein
pop, keindequeue.isEmpty()undsize()wie beim Stapel, daher hier weggelassen.
Der Iterator, das eigentlich Neue auf der Seite:
implements Iterable<Item>plusiterator()machtfor (Item x : bag)möglich.ListIteratorhält einen Zeigercurrent, der beifirststartet.hasNext(): Gibt es noch einen Knoten (current != null)?next(): Wert holen,currentaufcurrent.nextweiterschieben.remove(): leer, nicht unterstützt.
Wofür? Immer wenn man nur sammeln und später auswerten will, z. B. Messwerte einlesen und dann Mittelwert und Standardabweichung berechnen. Später im Buch (Kapitel 4) sind die Adjazenzlisten der Graphen genau solche Bags: Für jeden Knoten werden die Nachbarn gesammelt, die Reihenfolge ist egal.
Bezug zu den anderen: Genau dieser Iterator-Code ist das, was in [15] und [16] fehlte. Stapel und Schlange mit verketteter Liste bekommen ihn eins zu eins dazu. Im Fließtext steht übrigens „Algorithmen 1.1 und 1.2“, gemeint sind aber die Listenversionen 1.2 und 1.3. Algorithmus 1.1 hat seinen eigenen ReverseArrayIterator schon dabei.
Kapitel 1.3 komplett:
- Algorithmus 1.1: Stapel mit Resizing-Array (LIFO)
- Algorithmus 1.2: Stapel mit verketteter Liste (LIFO)
- Algorithmus 1.3: Warteschlange mit verketteter Liste (FIFO)
- Algorithmus 1.4: Bag mit verketteter Liste (Reihenfolge egal, nur hinzufügen und durchlaufen)