{"id":32,"date":"2005-10-11T09:41:28","date_gmt":"2005-10-11T07:41:28","guid":{"rendered":"http:\/\/www.epischel.de\/wordpress\/?p=32"},"modified":"2006-03-31T14:39:28","modified_gmt":"2006-03-31T12:39:28","slug":"fernsehkanale-und-sortieralgorithmen","status":"publish","type":"post","link":"https:\/\/www.epischel.de\/wordpress\/2005\/10\/fernsehkanale-und-sortieralgorithmen\/","title":{"rendered":"Fernsehkan\u00e4le und Sortieralgorithmen"},"content":{"rendered":"<p>Wir haben letztens unseren defekten Videorekorder durch einen neuen ersetzt. Nun stand ich vor dem Problem, alle Kan\u00e4le so einzuspeichern wie auf dem Fernseher. Ich habe mich daf\u00fcr entschieden, einen automatischen Sendersuchlauf durchzuf\u00fchren und dann mit der vorhandenen Funktion &#8222;2 Kan\u00e4le vertauschen&#8220; alle Kan\u00e4le an ihren richtigen Platz zu bewegen.<\/p>\n<p><strong><br \/>\nWelcher Algorithmus ist hier der beste?<\/strong> Gegeben sei eine unsortierte Liste von Zahlen (die Zahl steht f\u00fcr die entg\u00fcltige Senderplatzierung) sowie eine Vergleichsfunktion und eine Funktion zum Vertauschen von zwei Kanalpl\u00e4tzen. Gesucht ist der g\u00fcnstigste Algorithmus, um die Zahlen zu sortieren. G\u00fcnstig meint minimal bzgl. der Summe der Distanzen, \u00fcber die Kan\u00e4le vertauscht werden. Die Distanzen sind deshalb wichtig, weil ich auf der Fernbedienung entsprechend oft &#8222;vor&#8220; bzw. &#8222;zur\u00fcck&#8220; dr\u00fccken muss. Dies sollte minimal sein.<\/p>\n<p>Die erste Idee ist nat\u00fcrlich, die klassischen Suchalgorithmen zu untersuchen. Ich bin nach <a href=\"http:\/\/de.wikipedia.org\/wiki\/Selection_Sort\">Selection Sort<\/a> vorgegangen. <a href=\"http:\/\/de.wikipedia.org\/wiki\/Quicksort\">Quicksort<\/a> f\u00e4llt mir ein, weil dort auch Elemente vertauscht werden. Auch <a href=\"http:\/\/de.wikipedia.org\/wiki\/Bubblesort\">Bubble Sort<\/a> nicht vergessen, weil dort nur benachbarte Elemente vertauscht werden, die Distanz also immer 1 ist. <\/p>\n<p>Vielleicht gibt es einen anderen g\u00fcnstigen Algorithmus, weil wir hier ja Besonderheiten vorliegen haben: Gegeben ist eine Permutation von Zahlen 1 .. N, nicht eine beliebige Zahlenfolge. <\/p>\n<p>Ich werde mal einige Untersuchungen durchf\u00fchren und die Ergebnisse an dieser Stelle ver\u00f6ffentlichen.<\/p>\n<p><!--adsense--><\/p>\n<p><strong>Update 03.11.2005<\/strong>: Ich habe drei Algorithmen untersucht: BubbleSort, SelectionSort und QuickSort.<\/p>\n<p>Den Standard-BubbleSort-Algorithmus habe modifiziert, s.d. die Liste vorw\u00e4rt und r\u00fcckw\u00e4rts durchschritten wird &#8211; da die Distanz zwischen zwei Vertauschungen wichtig ist, hilft dies, diese Distanzen zu veringern.<\/p>\n<p>W\u00e4hrend ich SelectionSort aus dem Lehrbuch angewendet habe, ist meine Quicksort-Implementierung mit den &#8222;\u00fcblichen&#8220; Optimierungen versehen: f\u00fcr kleine Teilmengen wird SelectionSort angewendet. Die Wahl des Pivot-Elementes ist einfach, da die Positionsnummer mit dem Wert zusammenf\u00e4llt und damit immer der &#8222;mittlere&#8220; Wert einer Liste genommen werden kann.<\/p>\n<p><strong>Zu den Ergebnissen:<\/strong> BubbleSort bleibt am wenigsten effizient. SelectionSort und QuickSort liefern sich ein Kopf-an-Kopf-Rennen, wobei es darauf ankommt, ab welcher Listenl\u00e4nge QuickSort auf SelectionSort zur\u00fcckf\u00e4llt.<\/p>\n<p>Wie folgendes Diagramm zeigt, &#8222;gewinnt&#8220; BubbleSort gegen SelectionSort ziemlich unabh\u00e4ngig von der Anzahl der Kan\u00e4le: der durchschnittliche Rang betr\u00e4gt 1,8 (Rang 1 f\u00fcr den Gewinner, Rang 2 f\u00fcr den Verlierer, bei 2000 zuf\u00e4lligen Kanalbelegungen).<br \/>\n<img decoding=\"async\" src=\"http:\/\/www.epischel.de\/wordpress\/wp-content\/ks-bs-vs-ss.png\" alt=\"BubbleSort vs. SelectionSort\" \/><\/p>\n<p>Beim Rennen SelectionSort gegen QuickSort ist der Ausgang abh\u00e4ngig von der Anzahl der Kan\u00e4le sowie dem Schwellwert, ab dem Quicksort in SelectionSort \u00fcbergeht. Mit zunehmender Anzahl von Kan\u00e4len wird Quicksort st\u00e4rker, bei ca. 39 Kan\u00e4len gibt es im Mittel ein &#8222;Unentschieden&#8220;. Der Einfluss des genannten Schwellwertes l\u00e4\u00dft sich schlecht beschreiben. Das folgende Diagramm zeigt eine &#8222;Draufsicht&#8220; auf ein 3D-Diagramm. Die X-Koordinate ist der genannte Schwellwert, die Y-Koordinate die Anzahl der Kan\u00e4le. Die Farbe kodiert den mittleren Rang. Alles &#8222;ab&#8220; orange (und &#8222;h\u00f6her&#8220;) stellt den Gewinn (im Mittel) f\u00fcr QuickSort dar. Die blaue Fl\u00e4che rechts der Diagonale steht &#8222;keine Messung&#8220;, da dort der Schwellwert h\u00f6her als die H\u00e4lfte der Anzahl der Kan\u00e4le liegt.<br \/>\n<img decoding=\"async\" src=\"http:\/\/www.epischel.de\/wordpress\/wp-content\/ks-ss-vs-qs.png\" alt=\"SelectionSort vs. Quicksort\" width=\"450\"\/><br \/>\nEs scheint also so zu sein, dass eine &#8222;Vorsortierung&#8220; mittels Quicksort desto vorteilhafter ist, je gr\u00f6\u00dfer die Anzahl der Kan\u00e4le.<\/p>\n<p>Es bleibt die Frage, ob es einen anderen, g\u00fcnstigeren Algorithmus gibt.<\/p>\n<div class=\"syndication-links\"><\/div>","protected":false},"excerpt":{"rendered":"<p>Wie kann ich die sich beim automatischen Sendersuchlauf ergebene zuf\u4b2cige Reihenfolge von TV-Kan\u4b25n in eine vorgegebene Reihenfolge bringen?<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"mf2_syndication":[],"webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[6,4,2],"tags":[],"series":[],"class_list":["post-32","post","type-post","status-publish","format-standard","hentry","category-familie","category-medien","category-entwicklung","kind-"],"kind":false,"_links":{"self":[{"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/posts\/32","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/comments?post=32"}],"version-history":[{"count":0,"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/posts\/32\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/media?parent=32"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/categories?post=32"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/tags?post=32"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/series?post=32"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}