Aufgabe 8.4

counting sort

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Aufgabe 8.4
Hallo, kann mir jemand einen tipp geben wie man die sortierung stabil hinbekommt, da die testcases ja darauf testen und mir bis jetzt keine möglichkeit eingefallen ist wie ich parrallel in output schreiben kann und dabei die auch noch reihenfolge beachten kann?


Jeder Thread hat ja sein eigenes Prefix-Array, in dem nur die “Adressen” für die Objekte stehen, die der Thread selbst bearbeitet hat. Im Prefix-Array von Thread 3 wird aber der Inhalt vom Prefix-Array von Thread 2 berücksichtigt usw. D.h. wenn du eine “Adresse” aus dem Prefix-Array für deinen Thread nimmst und an diese Stelle im Output-Array das Objekt kopierst, wird kein anderer Thread auch auf diese Adresse zugreifen.

Was möglicherweise verwirrend sein könnte, ist dass im Wikipedia-Eintrag das Schreiben auf das output-Array von rechts nach links vorgenommen wird. So wie der counting-Algorithmus funktioniert musst du das Array aber von links nach rechts durchgehen und die Einträge im Prefix-Array jedes mal um eins erhöhen statt erniedrigen, damit bei einem Mehrfacheintrag der nächste Eintrag eins weiter rechts landet als der vorherige.


Okay danke!


Hallo , ich hab versucht das instantiating von blockingqueue zu machen aber ich bekomme fehlermeldung
BlockingQueue inQueue = new BlockingQueue();

habe mir überlegt mit Linkedblockingqueue zu arbeiten aber in thread konstruktor sind die queues als blockingqueue übergeben und das darf ich nicht ändern denk ich.


Prinzipiell wäre es in so einem Fall sinnvoll, wenn du auch die Fehlermeldung postest. In dem Fall ist es aber ziemlich offensichtlich. Such die “BlockingQueue” mal in der Java-API und schau dir an, was für eine Art von Objekt das ist ((Abstrakte-)Klasse, Interface, …) und überleg, ob du dieses “Ding” instanziieren kannst.

Noch ein Tipp: Das verwenden anderer Klassen ist nur dann nicht erlaubt, wenn sie eine andere Schnittstelle verwenden als die vorgegebene. Welche Schnittstelle implementiert die LinkedBlockingQueue?


ja sie implementiert die blockingqueue :smiley: alles klar danke schön


Muss der Konstruktor von SortingRunnableImpl die gleiche Parameterliste wie der Konstruktor in SortingRunnable haben oder darf man weitere Parameter hinzufügen?


Die Beschreibung der columnSum-Methode erschließt sich mir nicht ganz.
So wie ich das Vorgehen verstehe holt sich ein Thread die Summe einer Spalte über die vorherigen Zeilen als Integer aus seiner inQueue, addiert den Wert seiner Zelle darauf und schiebt das Ergebnis in seine outQueue. Der letzte Thread überträgt die Spaltensumme nicht in eine Queue, sondern in das ColumnSums-Array. Damit würde man aber nur eine Zeile von ColumnSums brauchen, allerdings haben wir diese Matrix in der ersten Teilaufgabe vermutlich nicht umsonst als Matrix deklariert^^
Wie sollen die ganzen Zeilen von ColumnsSums befüllt werden? Immer mit den Zwischenergebnissen?


Ich hab für den letzten Wert von testStableSort ein prefix von 10 was dementsprechend einen outofbounds verursacht. Jemand Vorschläge worran das liegt? Oder ist der Prefix korrekt?


Nein, dein prefix ist falsch. Aber um zu sagen wo genau, ist die Fehlerbeschreibung zu ungenau :wink:


Es ist ganz nützlich sich mal die SequentiellePrefix anzusehen und vorallem was sie wohin schreibt.
Dann sollte auch klar sein, was der maximale Prefix sein darf. Wenn die Threadanzahl sinkt müssen die Prefixe dementsprechend anders verteilt werden.