https://de.wikipedia.org/w/api.php?action=feedcontributions&feedformat=atom&user=OptimalslothWikipedia - Benutzerbeiträge [de]2025-05-12T15:14:34ZBenutzerbeiträgeMediaWiki 1.44.0-wmf.28https://de.wikipedia.org/w/index.php?title=Andor&diff=228349877Andor2022-11-27T15:18:00Z<p>Optimalsloth: /* Staffel 1 */ Typos</p>
<hr />
<div>{{Infobox Fernsehsendung<br />
| Bild = Andor-logo-schwarz.png<br />
| Deutscher Titel = Andor<br />
| Originaltitel = Andor<br />
| Produktionsland = Vereinigte Staaten<br />
| Erstausstrahlungsjahre = seit 2022<br />
| Produzent = [[Kate Hazell]],<br />[[David Meanti]]<br />
| Produktionsunternehmen = [[Lucasfilm]],<br />[[The Walt Disney Company|Walt Disney Studios]]<br />
| Länge = 38–57<br />
| Episoden = 12<!-- Stand: 23. Nov. 2022 --><br />
| Staffeln = 1+<br />
| Originalsprache = Englisch<br />
| Musik = [[Nicholas Britell]]<br />
| Kamera = [[Adriano Goldman]],<br />[[Frank Lamm]],<br />[[Damián García]],<br />[[Jonathan Freeman (Kameramann)|Jonathan Freeman]]<br />
| Schnitt = [[John Gilroy]],<br />[[Tim Porter]],<br />[[Hazel Baille]],<br />[[Dan Roberts]],<br />[[Frances Parker]],<br />[[Matthew Cannings]],<br />[[Simon Smith (Filmeditor)|Simon Smith]],<br />[[Yan Miles]]<br />
| Titellied =<br />
| Idee = [[Tony Gilroy]]<br />
| Genre = [[Space Opera]],<br />[[Thriller]],<br />[[Drama (Filmgenre)|Drama]]<br />
| Premiere = 21. September 2022<br />
| Sender = [[Disney+]]<br />
| Premiere_DE = 21. September 2022<br />
| Sender_DE = Disney+<br />
| Besetzung = 1<br />
| Synchronisation = 1<br />
}}<br />
<br />
'''Andor''', auch '''Star Wars: Andor''' ist eine [[Vereinigte Staaten|US-amerikanische]] [[Space Opera|Space-Opera]]-Serie von [[Tony Gilroy]], die am 21. September 2022 auf dem [[Streaming Media|Streaming]]-Portal [[Disney+]] startete. Die Serie ist Teil des ''[[Star Wars|Star-Wars]]''-Universums von [[George Lucas]] und erzählt die Vorgeschichte des Kinofilms ''[[Rogue One: A Star Wars Story]]'' (2016). In der titelgebenden Hauptrolle ist [[Diego Luna]] als Rebellen-Kapitän und Spion [[Figuren aus Star Wars#Cassian Andor|Cassian Andor]] zu sehen.<br />
<br />
Die erste Staffel umfasst 12 Episoden. Eine zweite und zugleich letzte Staffel befindet sich bereits in Produktion.<br />
<br />
== Handlung ==<br />
{{Siehe auch|Andor (Fernsehserie)/Episodenliste}}<br />
Die Serie folgt dem späteren Rebellen Cassian Andor und erzählt die Anfänge der sich bildenden Rebellenallianz und dem Wandel der Figur vom verruchten Gesetzlosen, bis hin zu einem loyalen Kämpfer der Rebellion, der später zu seinem Heldentod bei der Beschaffung der [[Todesstern]]-Baupläne führt. Andor steht im Fokus der Handlung, wobei verschiedenen Nebenhandlungen diverse weitere Figuren und deren Geschichten begleiten, und das alltägliche Leben in der Galaxis unter der Terrorherrschaft des Galaktischen Imperiums beleuchtet.<br />
<br />
=== Staffel 1 ===<br />
Die Serie setzt fünf Jahre vor der [[Krieg der Sterne|Schlacht von Yavin]] und somit 14 Jahre nach der Umformung der Galaktischen Republik zum Galaktischen Imperium durch [[Figuren aus Star Wars#Sheev Palpatine/Darth Sidious|Imperator Palpatine]] an.<br />
<br />
Zu Beginn sucht [[Figuren aus Star Wars#Cassian Jeron Andor|Cassian Andor]] auf der Hauptwelt des Preox-Morlana-Sicherheitskonzerns, einer vom Imperium unabhängig agierenden privaten Sicherheitsfirma, nach seiner Schwester. Diese hat er seit seiner Kindheit nicht mehr gesehen, da das Imperium mit der Zeit ihren Heimatplaneten Kenari ausgebeutet hat, wobei er schließlich von der Plünderin Maarva Andor mitgenommen wird, als sich die Situation dort verschärft. Seine Suche verläuft jedoch suboptimal, da er zwei Mitarbeiter des Konzerns tötet und fortan flüchtet.<br />
<br />
Dies ruft den dem Sicherheitskonzern angehörigen [[Figuren aus Star Wars#Syril Karn|Inspektor Syril Karn]] auf den Plan, der mit einer kleinen Gruppe an Soldaten Cassians Spur auf den Planeten Ferrix zurückverfolgt. Dort leben auch die mittlerweile gesundheitlich angeschlagene Maarva und die Mechanikerin Bix Caleen, die für Cassian den Kontakt zu einem mysteriösen Käufer herstellt, da dieser eine imperiale Starpath-Einheit erbeuten konnte.<br />
Der Käufer tritt Cassian tatsächlich gegenüber und beide entkommen knapp, wobei ein großer Teil von Syrils Soldaten ums Leben kommt und dieses Ereignis ihn fassungslos zurücklässt.<br />
<br />
Als Konsequenz wird der Konzern dem Imperium unterstellt und Cassian willigt in das Angebot des Käufers ein, an einem Diebstahl teilzunehmen. Dieser findet auf dem Planeten Aldhani statt, wobei es der Gruppe nach anfänglichen Reibereien gelingt, diesen durchzuführen und sie den Quartalslohn eines ganzen imperialen Sektors erbeuten können. Dabei überleben nur Cassian sowie die Anführerin der Gruppe Vel Sartha und Cinta Kaz; während jene eigene Wege gehen, taucht Cassian unter falschem Namen mit seinem Anteil auf der tropischen Welt Niamos unter, wird dort aber (ohne erkannt zu werden) zu sechs Jahren Gefängnis verurteilt.<br />
<br />
Der Diebstahl auf Aldhani erregt wiederum die Aufmerksamkeit der Imperialen Sicherheitsbehörde (ISB) und [[Figuren aus Star Wars#Wullf Yularen|Colonel Wullf Yularen]], wobei letzterer höhere Strafen und drastische Maßnahmen als Folge dessen ankündigt. Derweil glaubt die aufstrebende Supervisorin [[Figuren aus Star Wars#Dedra Meero|Dedra Meero]], in mehreren scheinbar zufällig geschehenen Ereignissen eine geplante Rebellion zu erkennen, stößt aber beim Vorgesetzten Major Partagaz auf Unverständnis. Mit der Zeit gelingt es ihr jedoch dessen Anerkennung zu gewinnen und sie erkennt schließlich einen Mittelpunkt in den Aktionen, einen Fremden mit dem Codenamen ''Axis''. Da Derdra überzeugt ist, dass Bix Informationen über Axis' Aufenthaltsort und Identität besitzt, lässt sie Bix u. a. mit den Schreien von durch das Imperium ermordeten Kindern foltern.<br />
<br />
Der mysteriöse ''Axis'' heißt eigentlich [[Figuren aus Star Wars#Luthen Rael|Luthen Rael]] und führt ein Doppelleben als Rebell und Antiquitätenhändler auf [[Orte aus Star Wars#Coruscant|Coruscant]], von dem nur seine Mitarbeiterin Kleya Marki weiß; zudem hat er mit Supervisor Lonni Jung einen Spion in den Reihen der ISB. Da Cassian verschwunden ist, ist Kleya besorgt, dass er Luthens Identität offenlegen könnte, und befiehlt Vel die Ermordung von Cassian. Luthen wiederum sucht Unterstützung beim Widerstandskämpfer und Partisanen [[Figuren aus Star Wars#Saw Gerrera|Saw Gerrera]], der ihn zu dessen Enttäuschung abweist; beide können sich dennoch darauf einigen, dass sie eine andere Rebellengruppe opfern müssen, damit sie überleben können.<br />
<br />
Parallel versucht [[Figuren aus Star Wars#Mon Mothma|Senatorin Mon Mothma]] durch die politischen Intrigen zu navigieren, denen nicht einmal ihre Familie entkommen kann, zumal ihr (arrangierter) Ehemann Perrin Fertha sie wenig dabei unterstützt. Da die Gelderverschiebung zwischen ihr und Luthen immer schwieriger wird, wendet sie sich an ihren alten Freund, den Banker Tay Kolma, der ihr auch nur begrenzt helfen kann. Die Probleme hingegen spitzen sich zu, sodass sie Hilfe vom chandrilanischen Gangster Davo Sculdun ersucht, der als Gegenleistung ein Treffen zwischen ihren Kindern fordert, das zu einer Zwangsheirat führen soll. Später gelingt es ihr zudem, ihrem Fahrer, der sie für den ISB ausspionieren soll, weiszumachen, dass ihr Mann das Geld aufgrund seiner Spielsucht verschleudert.<br />
<br />
Cassian wird zur gleichen Zeit auf dem Planeten Narkina 5 auf einer sterilen Gefängnisinsel festgehalten, wo er mit anderen Gefangenen technische Apparaturen für einen unbekannten Zweck zusammenbaut. Nach einiger Zeit gelingt es ihm, den Vorarbeiter Kino Loy auf seine Seite zu bringen, ehe er mit diesem und anderen eine Gefängnisrevolte in Gang setzt. Cassian und Ruescott Melshi, einem weiteren Gefangenen, gelingt die Flucht, wobei Kino freiwillig zurückbleibt, da er nicht schwimmen, und somit den im Wasser liegenden Gefängniskomplex nicht verlassen kann.<br />
<br />
Nach Maarvas Tod richtet sich alle Aufmerksamkeit auf Ferrix, da Dedra dort ''Axis'' vermutet und Luthen sowie Vel und Cinta planen, Cassian zu töten, während Syril ihn ebenfalls aufspüren möchte. Während des großen Trauermarsches spielt Maarvas und Cassians Droide eine von ihr aufgezeichnete Nachricht ab, in der sie die Bewohner zur Bekämpfung des Imperiums aufruft. Ein imperialer Captain macht jedoch einen Fehler, indem er die Übertragung zu unterbinden versucht, was eine Straßenschlacht auslöst. Dabei wird Dedra um ein Haar getötet, aber von Syril gerettet, und Cassian befreit die inhaftierte Bix. Nachdem er seinen Freunden hilft, von Ferrix zu entkommen, stellt er Luthen vor die Wahl, ihn umzubringen oder einsteigen zu lassen.<br />
<br />
Zeitgleich ist im Orbit von [[Orte aus Star Wars#Scarif|Scarif]] der erste [[Todesstern]] fast fertiggestellt, wobei die Arbeiten der Gefangenen von Narkina 5 zu ihrer Unkenntnis in das noch im Bau befindliche Laser-Modul überführt werden.<br />
<br />
== {{Anker|Besetzung|Synchronisation}} Besetzung und Synchronisation ==<br />
[[Datei:Diego Luna Berlinale 2017.jpg|mini|hochkant|Hauptdarsteller [[Diego Luna]], 2017]]<br />
In der titelgebenden Hauptrolle ist [[Diego Luna]] zu sehen, welcher die Rolle zum zweiten Mal verkörpert. Weitere tragende Rollen umfassen [[Adria Arjona]] als Mechanikerin Bix Caleen, [[Stellan Skarsgård]] als Rebellen-Sympathisant Luthen Rael und [[Kyle Soller]] sowie [[Denise Gough]] als Gegenspieler Syril Karn, der dem imperialen Sicherheitskonzern Preox-Morlana angehört, und Lieutenant Dedra Meero, eine Angehörige der ISB.<br />
<br />
Zudem sind [[Fiona Shaw]] als Cassians Adoptivmutter Maarva Andor, [[Joplin Sibtain]] als Brasso, [[Alex Ferns]] als Karns Stellvertreter Sergeant Linus Mosk sowie [[Ben Miles (Schauspieler)|Ben Miles]] als Tay Kolma, ein Banker und Verbündeter von Senatorin Mon Mothma, zu sehen.<br />
<br />
Diese wird nach ''[[Star Wars: Episode III – Die Rache der Sith|Episode III]]'' und ''Rogue One'' zum dritten Mal von [[Genevieve O’Reilly]] gespielt, die sie ebenfalls in ''[[Star Wars Rebels|Rebels]]'' sprach. [[Malcolm Sinclair]] verkörpert Colonel Wullf Yularen, eine weitere Figur aus den Animationsserien ''[[Star Wars: The Clone Wars (Fernsehserie)|The Clone Wars]]'' und ''Rebels'', die hier ihr zweites Live-Action-Debüt feiert und vorher von [[Tom Kane (Synchronsprecher)|Tom Kane]] gesprochen bzw. in ''Episode IV'' von [[Robert Clarke (Schauspieler)|Robert Clarke]] gespielt wurde. [[Forest Whitaker]] porträtiert erneut Saw Gerrera, den er bereits in mehreren anderen ''Star-Wars-''Medien verkörperte bzw. sprach, während [[Duncan Pow]] seine Rolle aus ''Rogue One'' wieder aufnahm.<br />
<br />
Die deutschsprachige Synchronfassung entsteht nach [[Dialogbuch|Dialogbüchern]] von [[Klaus Bickert]], [[Markus Jütte]], [[Christian Langhagen]], [[Laura Johae]] und [[Björn Schalla]] sowie unter der [[Dialogregie]] von Schalla und [[Birte Baumgardt]] bei [[FFS Film- & Fernseh-Synchron]] in Berlin.<br />
<br />
[[Marcel Collé]], [[Björn Schalla]] und [[Tobias Meister]] übernahmen ihre jeweiligen Rollen aus ''Rogue One'', wie auch [[Erich Räuker]] seine aus den Animationsserien. Für Mon Mothma wurde erneut [[Alexandra Lange]] verpflichtet, welche die Figur erstmals in ''Die Rückkehr der Jedi-Ritter'' sprach.<br />
{| class="wikitable"<br />
! Rollenname<br />
! Darsteller<br />
! Porträt<br />
! Hauptrolle<br />(Episoden)<br />
! Nebenrolle<br />(Episoden)<br />
! Gastrolle<br />(Episoden)<br />
! Synchronsprecher<ref>{{Synchronkartei|serie|53096|Abruf=2022-09-26}}</ref><br />
|-<br />
| rowspan="3" | [[Figuren aus Star Wars#Cassian Andor|Cassian Jeron Andor]] / Kassa<br />
| [[Diego Luna]]<br />
| [[Datei:Diego Luna - Lucca Comics & Games 2018 01.jpg|75x75px]]<br />
| 1.01–<br />
|<br />
|<br />
| [[Marcel Collé]]<br />
|-<br />
| [[Antonio Viña]] <small>(Kind)</small><br />
|<br />
|<br />
| 1.01–1.03<br />
|<br />
| rowspan="2" | –{{FN|1}}<br />
|-<br />
| [[Lucas Bond]] <small>(jung)</small><br />
|<br />
|<br />
|<br />
| 1.07, 1.12<br />
|-<br />
| Inspektor [[Figuren aus Star Wars#Syril Karn|Syril Karn]]<br />
| [[Kyle Soller]]<br />
| [[Datei:Kyle Soller at The Keeping Room UK Premiere.jpg|75x75px]]<br />
| 1.01–1.05, 1.07–1.09, 1.11–1.12<br />
|<br />
|<br />
| [[Tim Kreuer]]<br />
|-<br />
| Bix Caleen<br />
| [[Adria Arjona]]<br />
| [[Datei:Adria Arjona 2022 (cropped).jpg|75x75px]]<br />
| 1.01–1.03, 1.07–1.09, 1.11–1.12<br />
|<br />
|<br />
| [[Giuliana Jakobeit]]<br />
|-<br />
| Brasso<br />
| [[Joplin Sibtain]]<br />
|<br />
| 1.01–1.03, 1.08, 1.11–1.12<br />
|<br />
|<br />
| [[Daniel Welbat]]<br />
|-<br />
| Timm Karlo<br />
| [[James McArdle]]<br />
| [[Datei:James McArdle at the London 2012 Olympics torch relay (cropped).jpg|75x75px]]<br />
| 1.01–1.03<br />
|<br />
|<br />
| [[Fabian Kluckert]]<br />
|-<br />
| Chefinspektor Hyne<br />
| [[Rupert Vansittart]]<br />
| [[Datei:Rupert Vansittart by Gage Skidmore.jpg|75x75px]]<br />
| 1.01, 1.04<br />
|<br />
|<br />
| [[Ernst Meincke]]<br />
|-<br />
| [[Figuren aus Star Wars#Luthen Rael|Luthen Rael]]<br />
| [[Stellan Skarsgård]]<br />
| [[Datei:Stellan Skarsgård 2009.jpg|75x75px]]<br />
| 1.02–1.08, 1.10–<br />
|<br />
|<br />
| [[Douglas Welbat]]<br />
|-<br />
| Sergeant Linus Mosk<br />
| [[Alex Ferns]]<br />
|<br />
| 1.02–1.04, 1.11–1.12<br />
|<br />
|<br />
| [[Dirc Simpson]]<br />
|-<br />
| Maarva Andor<br />
| [[Fiona Shaw]]<br />
| [[Datei:Fiona Shaw BAM 2011-01-16.jpg|75x75px]]<br />
| 1.02–1.03, 1.07–1.08, 1.12<br />
|<br />
|<br />
| [[Kerstin Sanders-Dornseif]]<br />
|-<br />
| Clem Andor<br />
| [[Gary Beadle (Schauspieler)|Gary Beadle]]<br />
|<br />
| 1.03, 1.07, 1.12<br />
|<br />
|<br />
| [[Sven Gerhardt]]<br />
|-<br />
| Senatorin [[Figuren aus Star Wars#Mon Mothma|Mon Mothma]]<br />
| [[Genevieve O’Reilly]]<br />
|<br />
| 1.04–<br />
|<br />
|<br />
| [[Alexandra Lange]]<br />
|-<br />
| Lieutenant [[Figuren aus Star Wars#Dedra Meero|Dedra Meero]]<br />
| [[Denise Gough]]<br />
|<br />
| 1.04–<br />
|<br />
|<br />
| [[Flavia Vinzens]]<br />
|-<br />
| Vel Sartha<br />
| [[Faye Marsay]]<br />
| [[Datei:Faye Marsay by Gage Skidmore.jpg|75x75px]]<br />
| 1.04–1.09, 1.11–1.12<br />
|<br />
|<br />
| [[Nadine Heidenreich]]<br />
|-<br />
| Cinta Kaz<br />
| [[Varada Sethu]]<br />
|<br />
| 1.04–1.08, 1.10–1.12<br />
|<br />
|<br />
| [[Franziska Trunte]]<br />
|-<br />
| Kleya Marki<br />
| [[Elizabeth Dulau]]<br />
|<br />
| 1.04–1.08, 1.10–1.11<br />
|<br />
|<br />
| [[Moira May]]<br />
|-<br />
| Karis Nemik<br />
| [[Alex Lawther]]<br />
| [[Datei:Alex Lawther.jpg|75x75px]]<br />
| 1.04–1.06, 1.12<br />
|<br />
|<br />
| [[Jonas Lauenstein]]<br />
|-<br />
| Lieutenant Gorn<br />
| [[Sule Rimi]]<br />
|<br />
| 1.04–1.06<br />
|<br />
|<br />
| [[Tim Moeseritz]]<br />
|-<br />
| Taramyn Barcona<br />
| [[Gershwyn Eustace Jnr]]<br />
|<br />
| 1.04–1.06<br />
|<br />
|<br />
| [[Thomas Wenke]]<br />
|-<br />
| Arvel Skeen<br />
| [[Ebon Moss-Bachrach]]<br />
| [[Datei:Ebon Moss-Bachrach by Gage Skidmore.jpg|75x75px]]<br />
| 1.04–1.06<br />
|<br />
|<br />
| [[Uve Teschner]]<br />
|-<br />
| Perrin Fertha<br />
| [[Alastair Mackenzie]]<br />
|<br />
| 1.04–1.05, 1.07–1.09, 1.12<br />
|<br />
|<br />
| [[Boris Tessmann]]<br />
|-<br />
| Eedy Karn<br />
| [[Kathryn Hunter]]<br />
| [[Datei:Kathryn Hunter (cropped).jpg|75x75px]]<br />
| 1.04–1.05, 1.07, 1.09, 1.11<br />
|<br />
|<br />
| [[Karin David]]<br />
|-<br />
| Major Partagaz<br />
| [[Anton Lesser]]<br />
| [[Datei:Anton Lesser (2011).jpg|75x75px]]<br />
| 1.04, 1.06–1.10, 1.12<br />
|<br />
|<br />
| [[Detlef Gieß]]<br />
|-<br />
| Kommandant Jayhold Beehaz<br />
| [[Stanley Townsend]]<br />
|<br />
| 1.06<br />
|<br />
|<br />
| [[Klaus-Dieter Klebsch]]<br />
|-<br />
| Tay Kolma<br />
| [[Ben Miles (Schauspieler)|Ben Miles]]<br />
|<br />
| 1.07–1.10<br />
|<br />
|<br />
| [[Uwe Büschken]]<br />
|-<br />
| Ruescott Melshi<br />
| [[Duncan Pow]]<br />
|<br />
| 1.08–1.11<br />
|<br />
|<br />
| [[Björn Schalla]]<br />
|-<br />
| Kino Loy<br />
| [[Andy Serkis]]<br />
| [[Datei:Andy Serkis by Gage Skidmore 2.jpg|75x75px]]<br />
| 1.08–1.10<br />
|<br />
|<br />
| [[Lutz Schnell]]<br />
|-<br />
| [[Figuren aus Star Wars#Saw Gerrera|Saw Gerrera]]<br />
| [[Forest Whitaker]]<br />
| [[Datei:Forest Whitaker by Gage Skidmore.jpg|75x75px]]<br />
| 1.08, 1.11<br />
|<br />
|<br />
| [[Tobias Meister]]<br />
|-<br />
| Davo Sculdun<br />
| [[Richard Dillane]]<br />
|<br />
| 1.10, 1.12<br />
|<br />
|<br />
| [[Pierre Peters-Arnolds]]<br />
|-<br />
| B2EMO<br />
| [[Dave Chapman (Schauspieler)|Dave Chapman]] <small>(Stimme)</small><br />
|<br />
|<br />
| 1.01–1.03, 1.07–1.08, 1.11–1.12<br />
|<br />
| [[Otto Strecker (Schauspieler)|Otto Strecker]]<br />
|-<br />
| Wilmon Paak<br />
| [[Muhannad Bhaier]]<br />
|<br />
|<br />
| 1.01–1.03, 1.08, 1.12<br />
|<br />
| [[Linus Drews]]<br />
|-<br />
| Salman Paak<br />
| [[Abhin Galeya]]<br />
|<br />
|<br />
| 1.01–1.03, 1.08, 1.12<br />
|<br />
| [[Stephan Baumecker]]<br />
|-<br />
| Pegla<br />
| [[Kieran O’Brien]]<br />
|<br />
|<br />
| 1.01–1.02, 1.12<br />
|<br />
| [[Matthias Klages]]<br />
|-<br />
| Lieutenant Supervisor Blevin<br />
| [[Ben Bailey Smith]]<br />
|<br />
|<br />
| 1.04–1.07, 1.12<br />
|<br />
| [[Timo Weisschnur]]<br />
|-<br />
| Leida Mothma<br />
| [[Bronte Carmichael]]<br />
|<br />
|<br />
| 1.05, 1.07–1.09, 1.11–1.12<br />
|<br />
| [[Yamuna Kemmerling]]<br />
|-<br />
| Colonel [[Figuren aus Star Wars#Wullf Yularen|Wullf Yularen]]<br />
| [[Malcolm Sinclair]]<br />
| [[Datei:Malcolm Sinclair at the STR Theatre Book Prize ceremony on 18 May 2011 at the Drury Lane Theatre, London.jpg|75x75px]]<br />
|<br />
| 1.07–1.08<br />
|<br />
| [[Erich Räuker]]<br />
|-<br />
| Flob<br />
| [[Alex Blake (Schauspieler)|Alex Blake]]<br />
|<br />
|<br />
| 1.07–1.08<br />
|<br />
| [[Oliver Siebeck]]<br />
|-<br />
| Ham<br />
| [[Clemens Schick]]<br />
| [[Datei:Clemens Schick Berlinale 2010 (cropped).jpg|75x75px]]<br />
|<br />
| 1.08–1.10<br />
|<br />
| Clemens Schick<br />
|-<br />
| Ulaf<br />
| [[Christopher Fairbank]]<br />
|<br />
|<br />
| 1.08–1.10<br />
|<br />
| [[Lutz Mackensy]]<br />
|-<br />
| Taga<br />
| [[Tom Reed (Schauspieler)|Tom Reed]]<br />
|<br />
|<br />
| 1.08–1.10<br />
|<br />
| [[Lasse Dreyer]]<br />
|-<br />
| Jembroc<br />
| [[Brian Bovell]]<br />
|<br />
|<br />
| 1.08–1.10<br />
|<br />
| [[Dirk Bublies]]<br />
|-<br />
| Xaul<br />
| [[Josef Davies]]<br />
|<br />
|<br />
| 1.08–1.10<br />
|<br />
| [[Tobias Nath]]<br />
|-<br />
| Birnok<br />
| [[Rasaq Kukoyi]]<br />
|<br />
|<br />
| 1.08–1.10<br />
|<br />
| [[Rezân Cheikhamous]]<br />
|-<br />
| Doktor Gorst<br />
| [[Joshua James (Schauspieler)|Joshua James]]<br />
|<br />
|<br />
| 1.09<br />
|<br />
| [[Tobias Diakow]]<br />
|-<br />
| Nurchi<br />
| [[Raymond Anum]]<br />
|<br />
|<br />
|<br />
| 1.01–1.02, 1.08–1.10, 1.12<br />
| [[Kaze Uzumaki]]<br />
|-<br />
| Pre-Mor-Mitarbeiter<br />
| [[Alex Austin]]<br />
|<br />
|<br />
|<br />
| 1.01–1.02<br />
| [[Alex Friedland]]<br />
|-<br />
| Vetch<br />
| rowspan="2" | [[Ian Whyte]]<br />
| rowspan="2" | [[Datei:Ian-whyte-2018.jpg|75x75px]]<br />
|<br />
|<br />
| 1.01<br />
| [[Matthias Friedrich]]<br />
|-<br />
| Moroff<br />
|<br />
|<br />
| 1.08, 1.11<br />
| –{{FN|1}}<br />
|-<br />
| Willi<br />
| [[Ron Cook]]<br />
|<br />
|<br />
|<br />
| 1.02–1.03<br />
| [[Freimut Götsch]]<br />
|-<br />
| Xanvan „Xan“<br />
| [[Zubin Varla]]<br />
|<br />
|<br />
|<br />
| 1.02–1.03, 1.11–1.12<br />
| [[Samuel Zekarias]]<br />
|-<br />
| Granik<br />
| [[Kiran Shah]]<br />
| [[Datei:Kiran Shah, 2006.jpg|rahmenlos|75x75px]]<br />
|<br />
|<br />
| 1.02<br />
| –{{FN|1}}<br />
|-<br />
| Attendant Heert<br />
| [[Jacob James Beswick]]<br />
|<br />
|<br />
|<br />
| 1.04–1.12<br />
| [[Christian Holdt]]<br />
|-<br />
| Kloris<br />
| [[Lee Ross (Schauspieler)|Lee Ross]]<br />
|<br />
|<br />
|<br />
| 1.04–1.05, 1.07, 1.09, 1.12<br />
| [[Boris Tessmann]] (1.04)<br />[[Benjamin Kiesewetter (Schauspieler)|Benjamin Kiesewetter]] (1.05–1.07)<br />[[Martin Schubach]] (1.09)<br />
|-<br />
| Supervisor Lonni Jung<br />
| [[Robert Emms]]<br />
|<br />
|<br />
|<br />
| 1.04, 1.06–1.10, 1.12<br />
| [[Marco Rosenberg]]<br />
|-<br />
| Supervisor Lagret<br />
| [[Michael Jenn]]<br />
|<br />
|<br />
|<br />
| 1.04, 1.06–1.10, 1.12<br />
| [[Jens-Uwe Bogadtke]]<br />
|-<br />
| Supervisorin Grandi<br />
| [[Lucy Russell]]<br />
|<br />
|<br />
|<br />
| 1.04, 1.06–1.07, 1.12<br />
| [[Maria Sumner]]<br />
|-<br />
| Corporal Kimzi<br />
| [[Nick Blood]]<br />
| [[Datei:Nick Blood (cropped).jpg|75x75px]]<br />
|<br />
|<br />
| 1.05–1.06<br />
| [[Dennis Herrmann]]<br />
|-<br />
| Captain Vanis Tigo<br />
| [[Wilf Scolding]]<br />
|<br />
|<br />
|<br />
| 1.05, 1.08–1.09, 1.11–1.12<br />
| [[Sebastian Kaufmane]]<br />
|-<br />
| Colonel Petigar<br />
| [[Richard Katz (Schauspieler)|Richard Katz]]<br />
|<br />
|<br />
|<br />
| 1.06<br />
| [[Stefan Staudinger]]<br />
|-<br />
| Roboda Beehaz<br />
| [[Michelle Duncan]]<br />
|<br />
|<br />
|<br />
| 1.06<br />
| [[Heike Beeck]]<br />
|-<br />
| Leonart Beehaz<br />
| [[Alfie Todd]]<br />
|<br />
|<br />
|<br />
| 1.06<br />
| [[Bela Baum]]<br />
|-<br />
| Doktor Quadpaw<br />
| rowspan="3" | [[Aidan Cook]]<br />
| rowspan="3" |<br />
|<br />
|<br />
| 1.06<br />
| [[Harald Effenberg]]<br />
|-<br />
| KX-Sicherheitsdroide<br />
|<br />
|<br />
| 1.07<br />
| Matthias Friedrich<br />
|-<br />
| Benthic Two-Tubes<br />
|<br />
|<br />
| 1.08, 1.11<br />
| –{{FN|1}}<br />
|-<br />
| Küstentruppler<br />
| [[Sam Witwer]]<br />
| [[Datei:Sam Witwer by Gage Skidmore.jpg|75x75px]]<br />
|<br />
|<br />
| 1.07<br />
| [[Gedeon Burkhard]]<br />
|-<br />
| Leevan Tenza<br />
| [[Dilu Miah]]<br />
|<br />
|<br />
|<br />
| 1.08<br />
| –{{FN|1}}<br />
|-<br />
| Kullbee Sperado<br />
| [[Robert Nairne]]<br />
|<br />
|<br />
|<br />
| 1.08<br />
| –{{FN|1}}<br />
|-<br />
| Doktor Rhasiv<br />
| [[Adrian Rawlins]]<br />
| [[Datei:Adrian Rawlins à Imagin'ères Toulouse.jpg|75x75px]]<br />
|<br />
|<br />
| 1.09–1.10<br />
| [[Stephan Rabow]]<br />
|-<br />
| Doktor Mullmoy<br />
| [[Matt Dunkley]]<br />
|<br />
|<br />
|<br />
| 1.10, 1.12<br />
| rowspan="2" |–{{FN|2}}<br />
|-<br />
| Stakun Sculdun<br />
| [[Finley Glasgow]]<br />
|<br />
|<br />
|<br />
| 1.12<br />
|}<br />
{{FNZ|1|Originalton}}<br />
{{FNZ|2|Stumm}}<br />
<br />
== Einordnung in das ''Star-Wars''-Universum ==<br />
Die Handlung setzt fünf Jahre vor der Erbeutung der [[Todesstern]]-Pläne, bzw. den Ereignissen von ''Rogue One: A Star Wars Story'' und damit ebenso vor ''[[Krieg der Sterne]]'' (1977) an. Dabei deckt die erste Staffel in vier Blöcken das erste Jahr ab, während die zweite Staffel die darauffolgenden vier Jahre erzählen soll.<ref name=":1">{{Internetquelle |autor=Borys Kit |url=https://www.hollywoodreporter.com/heat-vision/star-wars-cassian-andor-disney-series-adds-two-actors-1291772 |titel=‘Star Wars’: Cassian Andor Disney+ Series Adds Two Actors (Exclusive) |werk=[[The Hollywood Reporter]] |datum=2020-04-24 |sprache=en |abruf=2020-04-25}}</ref><br />
<br />
{{Zeitleiste Filme und Serien des Star-Wars-Universums}}<br />
<br />
== Produktion ==<br />
=== Entstehungsgeschichte ===<br />
[[Datei:Tony Gilroy (7732161230).jpg|mini|275x275px|[[Tony Gilroy]], Showrunner von ''Star Wars: Andor'']]<br />
Im November 2018 kündigte [[Lucasfilm]] an, dass die Arbeit an einer [[Prequel]]-Serie zum Film ''Rogue One: A Star Wars Story'' über die Figur Cassian Andor begonnen habe. Stilistisch sollte die Serie an einen [[Spionage]]-[[Thriller]] angelehnt sein. Als Hauptdarsteller kehrte [[Diego Luna]] zurück, der die Figur bereits im Film verkörpert hatte.<ref>{{Internetquelle |url=https://www.starwars.com/news/cassian-andor-live-action-series-announced |titel=Cassian Andor Live-Action Series Announced |werk=StarWars.com |datum=2018-11-08 |sprache=en |abruf=2019-01-04}}</ref> Als [[Showrunner]] der Serie wurde [[Tony Gilroy]] verpflichtet, nachdem zunächst berichtet wurde, dass Stephen Schiff diese Aufgabe übernehmen werde. Gilroy war als Autor bereits an der Entstehung von ''Rogue One: A Star Wars Story'' beteiligt gewesen. Schiff verblieb weiterhin Teil des Autorenteams der Drehbücher. Ebenso am Drehbuch beteiligten sich [[Dan Gilroy]] und [[Beau Willimon]]. Im Februar 2021 wurden [[Susanna White]] und Benjamin Caron als weitere Regisseure der Serie angekündigt.<ref>{{Internetquelle |autor=Jacob Fisher |url=https://discussingfilm.net/2021/02/04/ben-caron-susanna-white-set-to-direct-andor-series-exclusive/ |titel=Ben Caron & Susanna White Set To Direct ‘Andor’ Series (EXCLUSIVE) |werk=Discussing Film |datum=2021-02-04 |sprache=en |abruf=2021-02-07}}</ref><br />
<br />
Die Vorproduktion von ''Andor'' begann im September 2019 und einen Monat später sollte mit dem Drehen begonnen werden, nachdem Diego Luna seine Arbeit an der Serie ''[[Narcos: Mexico]]'' abgeschlossen hatte.<ref>{{Internetquelle |autor=Brent Lang |url=https://variety.com/2018/biz/news/star-wars-diego-luna-1203023798/ |titel=‘Star Wars’: Diego Luna to Lead Spinoff Series |werk=[[Variety]] |datum=2018-11-08 |sprache=en |abruf=2021-02-07}}</ref> Die Arbeiten an der Serie wurden etwa sechs Wochen nach Aufnahme der Vorproduktion aufgrund der [[COVID-19-Pandemie]] zunächst auf unbestimmte Zeit unterbrochen.<ref>{{Internetquelle |autor=Rohan Patel |url=https://www.comicbookmovie.com/tv/star_wars/cassian_andor/exclusive-cassian-andor-disney-series-had-completed-about-six-weeks-of-pre-production-prior-to-shut-down-a174467 |titel=Cassian Andor Disney+ Series had completed about six weeks of pre-production prior to shut down |werk=ComicBookMovie.com |datum=2020-04-10 |sprache=en |abruf=2020-04-25}}</ref><br />
<br />
=== Dreharbeiten ===<br />
Die Dreharbeiten zu ''Andor'' begannen Ende November 2020 in den [[Pinewood Studios]] in [[London]] unter der Regie von Toby Haynes.<ref>{{Internetquelle |autor=Maggie Dela Paz |url=https://www.comingsoon.net/tv/news/1157097-cassian-andor-has-begun-filming |titel=Cassian Andor: Diego Luna Confirms Disney+ Series Has Begun Filming |werk=ComingSoon.net |datum=2020-12-04 |sprache=en |abruf=2021-02-07}}</ref> Ursprünglich sollte bereits 2019 mit dem Drehen begonnen werden, doch der Beginn der Dreharbeiten wurde zuerst verschoben und später nach dem Ausbruch der COVID-19-Pandemie 2020 erneut. Deswegen entschied sich Regisseur Tony Gilroy, für die Dreharbeiten nicht von [[Amerika]] nach [[England]] zu reisen, und die Regieführung der ersten drei Episoden der Serie ging über an Toby Haynes. Gilroy verblieb jedoch als [[Executive Producer|ausführender Produzent]] und Showrunner der Serie.<ref>{{Internetquelle |autor=Justin Kroll |url=https://deadline.com/2020/09/black-mirrors-toby-haynes-rogue-one-disney-tony-gilroy-1234582109/ |titel=‘Black Mirror’s Toby Haynes To Direct ‘Rogue One’ Spin-Off Series At Disney+ As Tony Gilroy Steps Aside As Director |werk=[[Deadline (Website)|Deadline]] |datum=2020-09-22 |sprache=en |abruf=2021-02-07}}</ref> Die Produktion wurde Anfang 2021 schließlich wieder unter strengen Hygiene-Maßnahmen fortgesetzt. Mitte August 2021 wurden die Dreharbeiten an der Serie schließlich abgeschlossen.<ref>{{Internetquelle |url=https://bespinbulletin.com/2021/08/exclusive-andor-has-finished-filming/ |titel=EXCLUSIVE: Andor has finished filming |werk=Bespin Bulletin |datum=2021-08-22 |sprache=en |abruf=2021-08-22}}</ref><br />
<br />
Im Februar 2022 erklärte Darsteller [[Stellan Skarsgård]], dass die Dreharbeiten zur zweiten Staffel im Herbst 2022 starten sollen.<br />
<br />
== Veröffentlichung ==<br />
Die erste Staffel von ''Andor'' wurde ab dem 21. September 2022 im wöchentlichen Rhythmus auf der Video-Streaming-Plattform [[Disney+]] gezeigt. Dabei konnten zum Start bereits die ersten drei Episoden abgerufen werden.<ref>{{Internetquelle |autor=Erik Pedersen, Nellie Andreeva |url=https://deadline.com/2019/08/disney-plus-programs-movies-full-list-marvel-star-wars-pixar-simpsons-streaming-service-1202594496/ |titel=Disney+ Unveils ‘Lizzie McGuire’ Sequel, ‘Muppets’ Short-Form, ‘Obi-Wan Kenobi’ At D23 – Full List Of Streaming Service’s Programming |werk=Deadline |datum=2019-08-24 |sprache=en |abruf=2021-02-07}}</ref> Die erste Staffel umfasste zwölf Episoden und endete am 23. November 2022 mit dem Staffelfinale ''Rix Road''.<br />
<br />
== Rezeption ==<br />
{{Rezension<br />
|Bewertung1='''[[Rotten Tomatoes]]'''<br />
|Bewertung1Wert=<br />
|Bewertung2=Kritiker<br />
|Bewertung2Wert={{Rating|9.3|10}}<ref name="RottenTomatoes">{{Rotten Tomatoes|tv/andor|Andor|abruf=2022-11-18}} {{" |Sprache=en |Text=A gritty adventure told from the ground perspective of the Empire's reign, Andor is an exceptionally mature and political entry into the Star Wars mythos – and one of the best yet.}}</ref><br />
|Bewertung3=Publikum<br />
|Bewertung3Wert={{Rating|8.3|10}}<ref name="RottenTomatoes" /><br />
|Bewertung4='''[[Metacritic]]'''<br />
|Bewertung4Wert=<br />
|Bewertung5=Kritiker<br />
|Bewertung5Wert={{Rating|7.4|10}}<ref name="Metacritics">{{Metacritic|tv/andor|Andor|abruf=2022-11-18}}</ref><br />
|Bewertung6=Publikum<br />
|Bewertung6Wert={{Rating|7.8|10}}<ref name="Metacritics" /><br />
|Bewertung7='''[[Internet Movie Database|IMDb]]''' (Publikum)<br />
|Bewertung7Wert={{Rating|8.3|10}}<ref name="IMDb">{{Internetquelle |url=https://www.imdb.com/title/tt9253284/ |titel=Andor |hrsg=[[Internet Movie Database]] (IMDb) |sprache=en |abruf=2022-11-18}}</ref><br />
|Bewertung8='''[[Moviepilot]]'''<br />
|Bewertung8Wert={{Rating|7.4|10}}<ref name="moviepilot">{{Internetquelle |url=https://www.moviepilot.de/serie/star-wars-andor |titel=Andor |hrsg=[[Moviepilot]] |abruf=2022-11-18}}</ref><br />
}}<br />
{{Manueller Rahmen<br />
|content = {{Graph:Chart |width=280 |height=100 |type=rect<br />
|xAxisTitle=Staffel 1 – Folgen |yAxisTitle=Wertung (%)<br />
|x=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12<br />
|y=92, 89, 92, 90, 100, 100, 100, 100, 100, 100, 93<br />
|showValues= }}<br />
|caption = Episodenbewertung auf [[Rotten Tomatoes]]<ref name="RottenTomatoes" /><br />
|align = right<br />
}}<br />
<br />
Der Aggregator [[Rotten Tomatoes]] ermittelte eine Zustimmung von 93 % auf der Grundlage von 545 Kritikerbewertungen.<ref name="RottenTomatoes" /> [[Metacritic]], das einen gewichteten Durchschnitt verwendet, vergab eine Punktzahl von 74 von 100 auf der Grundlage von 31 Kritiken, was auf „allgemein positive Kritiken“ hinweist.<ref name="Metacritics" /><br />
<br />
Die britische Tageszeitung ''[[The Guardian]]'' betitelte ''Andor'' als {{" |Text=die beste Star-Wars-Serie seit ''[[The Mandalorian]]''}},<ref name="guardian_2022-09-21">{{Internetquelle |autor=Jack Seale |url=https://www.theguardian.com/tv-and-radio/2022/sep/21/rogue-one-andor-review-the-best-star-wars-show-since-the-mandalorian |titel=Andor review – the best Star Wars show since The Mandalorian |werk=[[The Guardian]] |datum=2022-09-21 |sprache=en |abruf=2022-10-08}}</ref> während das US-amerikanische Branchenblatt ''[[Variety]]'' sich positiv über ''Andors'' Abkehr von anderen ''Star-Wars-''Projekten äußerte, mit einer {{" |Text=Geschichte von Menschen, die nichts mit Solos, Skywalkers oder Palpatines zu tun haben, deren Leben aber dennoch wichtig ist}}.<ref name="Variety_2022-09-20">{{Internetquelle |autor=Caroline Framke |url=https://variety.com/2022/tv/news/andor-review-star-wars-rogue-one-disney-plus-1235376955/ |titel='Andor' Marks a Huge, and Hugely Welcome, Departure From Disney+’s Typical 'Star Wars' Model: TV Review |werk=[[Variety]] |datum=2022-09-20 |sprache=en |abruf=2022-10-08}}</ref><br />
<br />
Laut dem Filmkritiker [[Andreas Borcholte]] vom ''[[Der Spiegel (online)|Spiegel]]'' wähne man sich zu Beginn der Serie {{" |im falschen Science-Fiction-Film}}, da die Szenerie wie aus ''[[Blade Runner]]'' und ''[[WALL·E – Der Letzte räumt die Erde auf|WALL·E]]'' entsprungen wirke. ''Andor'' sei eine {{" |Text=»Star Wars«-Serie für Erwachsene, die eher auf ein panoramisches, weniger explosives Narrativ setzt.}} Im Gegensatz zu den letzten Fernsehserien im ''Star-Wars-''[[Franchise (Medien)|Franchise]] spielen {{" |Text=Jedi-Ritter, Sith-Lords und »Macht«-Brimborium mal keine Rolle.}}<ref name="spiegel_2022-09-21">{{Internetquelle |autor=[[Andreas Borcholte]] |url=https://www.spiegel.de/kultur/tv/star-wars-serie-andor-bei-disney-proletarier-zu-sternenkriegern-a-1cda2c0e-149d-4d3a-a1cc-a7634cd1d95a |titel=Proletarier zu Sternenkriegern |werk=[[Der Spiegel (online)|Der Spiegel]] |datum=2022-09-21 |abruf=2022-10-08}}</ref> Für den Filmkritiker Niklas Freund von der ''[[Süddeutsche Zeitung|Süddeutschen Zeitung]]'' ist ''Andor'' {{" |mehr [[Agententhriller]] als Zukunftsmärchen}}, womit der Franchise endlich mal wieder was riskiere.<ref name="sueddeutsche_2022-09-21">{{Internetquelle |autor=Nicolas Freund |url=https://www.sueddeutsche.de/medien/star-wars-andor-disney-plus-1.5660363 |titel=In dunklen Gassen |werk=[[Süddeutsche Zeitung]] |datum=2022-09-21 |abruf=2022-10-08}}</ref> Für Andreas Fischer von der Fernsehzeitschrift ''[[Prisma (Fernsehzeitschrift)|Prisma]]'' ist die Serie {{" |endlich ein Hit}}, da sie {{" |mit spannenden Abenteuern, einem authentischen Look und ambivalenten Figuren}} überzeuge und die Galaxie {{" |aus einer neuen Perspektive}} erkunde.<ref name="prisma_2022-09-21">{{Internetquelle |autor=Andreas Fischer |url=https://www.prisma.de/news/streaming/Andor-Kritik-Diese-Star-Wars-Serie-ist-endlich-ein-Hit,41360112 |titel=„Andor“: Diese „Star Wars“-Serie ist endlich ein Hit |werk=[[Prisma (Fernsehzeitschrift)|Prisma]] |datum=2022-09-21 |abruf=2022-10-08}}</ref> Für Stephanie Schlottag von der Computerspielezeitschrift ''[[GameStar]]'' ist {{" |Text=nicht nur der Look, auch die Stimmung der Serie […] galaxienweit von den bunten [[Space Opera|Sci-Fi-Opern]] der Filme entfernt}}, diese lege auch gegenüber ''Rogue One'' {{" |nochmal eine ordentliche Schippe Dreck und Gewalt oben drauf}}.<ref name="gamestar_2022-09-21">{{Internetquelle |autor=Stephanie Schlottag |url=https://www.gamestar.de/artikel/serienkritik-star-wars-andor-folge-1-2-3,3384794.html |titel=Serienkritik: Andor ist anders als alles, was wir bisher von Star Wars gesehen haben |werk=[[GameStar]] |datum=2022-09-21 |abruf=2022-10-08}}</ref><br />
<br />
Laut Benjamin Hecht vom Online-Portal ''[[Filmstarts]]'' glänze die Serie {{" |mit seiner Verliebtheit fürs Detail, dem einnehmenden Worldbuilding, starken Dialogen und einem beeindruckenden Produktionsaufwand}}, mache jedoch den {{" |gleichen Fehler wie bei ''[[Obi-Wan Kenobi (Fernsehserie)|Obi-Wan Kenobi]]''}}, da die Serie {{" |sich wirklich sehr viel Zeit lässt, die Welt und unzählige Nebenfiguren auszubauen}}. Zudem sei die {{" |komplette Struktur von ‚Andor‘ […] darauf ausgelegt, dass jeweils drei Folgen einen eigenen Handlungsbogen}} haben, werden jedoch ab der vierten Folge im Wochenrhythmus veröffentlicht, {{" |das Endprodukt wirkt dadurch träge}}.<ref name="filmstarts_2022-10-08">{{Internetquelle |autor=Benjamin Hecht |url=https://www.filmstarts.de/nachrichten/18544551.html |titel=Disney+ macht bei „Star Wars: Andor“ den gleichen Fehler wie bei „Obi-Wan Kenobi“ – Netflix zeigt, wie es besser geht! |werk=[[Filmstarts]] |datum=2022-10-05 |abruf=2022-10-08}}</ref> Für Andreas Engelhardt vom Online-Portal ''[[Kino.de]]'' {{" |Text=wirkt Andor wie eine Rückbesinnung auf aufrichtigere Zeiten}}, da die {{" |Text=letzten Star Wars-Titel dem von [[Marvel Cinematic Universe|Marvel-Filmen]] inspirierten lustig, lockeren, mit einem Augenzwinkern versehenen Ansatz folgten, den gefühlt so gut wie alle modernen Blockbuster kopieren.}}<ref name="kino_2022-09-21">{{Internetquelle |autor=Andreas Engelhardt |url=https://www.kino.de/serie/andor-2022/news/andor-kritik-darauf-haben-wir-im-star-wars-universum-seit-jahren-gewartet/ |titel=„Andor“-Kritik: Darauf haben wir im „Star Wars“-Universum seit Jahren gewartet |werk=[[Kino.de]] |datum=2022-09-21 |abruf=2022-09-24}}</ref><br />
<br />
== Weblinks ==<br />
* {{IMDb|tt9253284}}<br />
* {{fernsehserien.de|andor}}<br />
<br />
== Einzelnachweise ==<br />
<references responsive /><br />
<br />
{{Navigationsleiste Star Wars}}<br />
<br />
[[Kategorie:Fernsehserie (Vereinigte Staaten)]]<br />
[[Kategorie:Fernsehserie der 2020er Jahre]]<br />
[[Kategorie:Actionfernsehserie]]<br />
[[Kategorie:Star-Wars-Serie]]</div>Optimalslothhttps://de.wikipedia.org/w/index.php?title=Algorithmus_von_Kruskal&diff=214106597Algorithmus von Kruskal2021-07-22T13:06:35Z<p>Optimalsloth: Einzelnachweise zusammengeführt</p>
<hr />
<div>Der '''Algorithmus von Kruskal''' ist ein [[Greedy-Algorithmus]] der [[Graphentheorie]] zur Berechnung minimaler [[Spannbaum|Spannbäume]] von [[Ungerichteter Graph|ungerichteten Graphen]]. Der [[Graph (Graphentheorie)|Graph]] muss dazu zusätzlich [[Zusammenhang von Graphen|zusammenhängend]], [[Kantengewichteter Graph|kantengewichtet]] und endlich sein.<br />
<br />
Der Algorithmus stammt von [[Joseph Kruskal]], der ihn 1956 in der Zeitschrift „Proceedings of the [[American Mathematical Society]]“ veröffentlichte. Er beschrieb ihn dort wie folgt:<br />
: ''Führe den folgenden Schritt so oft wie möglich aus: Wähle unter den noch nicht ausgewählten Kanten von <math>G</math> (dem Graphen) die kürzeste Kante, die mit den schon gewählten Kanten keinen Kreis bildet.''<ref name="KRUSKAL">[[Joseph Kruskal]]: ''On the shortest spanning subtree and the traveling salesman problem.'' In: ''Proceedings of the American Mathematical Society'', 7, 1956, S. 48–50</ref><br />
<br />
Die kürzeste Kante bezeichnet dabei jeweils die Kante mit dem kleinsten Kantengewicht. Nach Abschluss des Algorithmus bilden die ausgewählten Kanten einen minimalen Spannbaum des Graphen.<br />
<br />
Wendet man den Algorithmus auf unzusammenhängende Graphen an, so berechnet er für jede [[Zusammenhang von Graphen|Zusammenhangskomponente]] des Graphen einen minimalen Spannbaum. Diese Bäume bilden einen [[Spannbaum|minimalen aufspannenden Wald]].<br />
<br />
== Idee ==<br />
Der Algorithmus von Kruskal nutzt die Kreiseigenschaft minimaler Spannbäume ({{enS|<u>m</u>inimum <u>s</u>panning <u>t</u>ree}}, MST). Dazu werden die Kanten in der ersten Phase aufsteigend nach ihrem Gewicht sortiert. In der zweiten Phase wird über die sortierten Kanten iteriert. Wenn eine Kante zwei Knoten verbindet, die noch nicht durch einen Pfad vorheriger Kanten verbunden sind, wird diese Kante zum MST hinzugenommen.<br />
<br />
== Beispiel ==<br />
{| class="wikitable"<br />
|-<br />
|[[Datei:Prim Algorithm 0.svg|200px]]<br />
|Dies ist der Graph, zu dem der Algorithmus von Kruskal einen minimalen Spannbaum berechnen wird. Die Zahlen bei den einzelnen Kanten geben das jeweilige Kantengewicht an. Zu Beginn ist noch keine Kante ausgewählt.<br />
|-<br />
|[[Datei:Kruskal Algorithm 1.svg|200px]]<br />
|Die Kanten AD und CE sind die kürzesten (noch nicht ausgewählten) Kanten des Graphen. Beide können ausgewählt werden. Hier wird zufällig AD ausgewählt. (Dass diese keinen Kreis bildet, ist im ersten Schritt selbstverständlich.)<br />
|-<br />
|[[Datei:Kruskal Algorithm 2.svg|200px]]<br />
|Nun ist CE die kürzeste, noch nicht ausgewählte Kante. Da sie mit AD keinen Kreis bildet, wird sie nun ausgewählt.<br />
|-<br />
|[[Datei:Kruskal Algorithm 3.svg|200px]]<br />
|Die nächste Kante ist DF mit Länge 6. Sie bildet mit den schon gewählten Kanten keinen Kreis und wird deshalb ausgewählt.<br />
|-<br />
|[[Datei:Kruskal Algorithm 4.svg|200px]]<br />
|Jetzt könnten die Kanten AB und BE, jeweils mit Länge 7, ausgewählt werden. Es wird zufällig AB gewählt. Die Kante BD wird rot markiert, da sie mit den bis jetzt gewählten Kanten einen Kreis bilden würde und somit im weiteren Verlauf des Algorithmus nicht mehr berücksichtigt werden muss.<br />
|-<br />
|[[Datei:Kruskal Algorithm 5.svg|200px]]<br />
|BE ist nun mit Länge 7 die kürzeste der noch nicht ausgewählten Kanten und da sie mit den bisher gewählten keinen Kreis bildet, wird sie ausgewählt. Analog zur Kante BD im letzten Schritt werden jetzt die Kanten BC, DE und FE rot markiert.<br />
|-<br />
|[[Datei:Kruskal Algorithm 6.svg|200px]]<br />
|Als letzte wird die Kante EG mit Länge 9 ausgewählt, da alle kürzeren bzw. gleich langen Kanten entweder schon ausgewählt sind oder einen Kreis bilden würden. Die Kante FG wird rot markiert. Da nun alle nicht ausgewählten Kanten einen Kreis bilden würden (sie sind rot markiert) ist der Algorithmus am Ende angelangt und der grüne Graph ist ein minimaler Spannbaum des zugrundeliegenden Graphen.<br />
|}<br />
<br />
== Algorithmus ==<br />
Die Grundidee ist, die Kanten in Reihenfolge aufsteigender Kantengewichte zu durchlaufen und jede Kante zur Lösung hinzuzufügen, die mit allen zuvor gewählten Kanten keinen [[Kreis (Graphentheorie)|Kreis]] bildet. Es werden somit sukzessiv sogenannte [[Zusammenhang (Graphentheorie)|Komponenten]] zum minimalen [[Spannbaum]] verbunden.<br />
<br />
=== Input ===<br />
Als Eingabe dient ein zusammenhängender kantenbewerteter Graph <math>G = (V,\,E,\,w)</math>. <math>V</math> bezeichnet die Menge der Knoten ''(vertices)'', <math>E</math> die Menge der Kanten ''(edges)''. Die Gewichtsfunktion <math>w\colon E \rightarrow \R</math> ordnet jeder Kante ein Kantengewicht zu.<br />
<br />
=== Output ===<br />
Der Algorithmus liefert einen minimalen Spannbaum <math>M = (V,\,E')</math> mit <math>E' \subseteq E</math>.<br />
<br />
=== Pseudocode ===<br />
Der Algorithmus von Kruskal arbeitet nicht-deterministisch, d.&nbsp;h., er liefert unter Umständen beim wiederholten Ausführen unterschiedliche Ergebnisse. Alle diese Ergebnisse sind minimale Spannbäume von <math>G</math>.<br />
[[Datei:KruskalDemo.gif|mini|160x160px|Ein Beispiel für den Algorithmus von Kruskal basierend auf dem [[Euklidischer Abstand|Euklidischen Abstand]].]]<br />
G = (V,E,w): ein zusammenhängender, ungerichteter, kantengewichteter Graph<br />
''kruskal''(G)<br />
1 <math>E' \leftarrow \emptyset</math><br />
2 <math>L \leftarrow E</math><br />
3 Sortiere die Kanten in L aufsteigend nach ihrem Kantengewicht.<br />
4 '''solange''' <math>L \neq \emptyset</math><br />
5 wähle eine Kante <math>e \in L</math> mit kleinstem Kantengewicht<br />
6 entferne die Kante <math>e</math> aus <math>L</math><br />
7 '''wenn''' der Graph <math>(V,E' \cup \lbrace e \rbrace)</math> keinen Kreis enthält<br />
8 '''dann''' <math>E' \leftarrow E' \cup \lbrace e \rbrace</math><br />
9 M = (V,E') ist ein minimaler Spannbaum von G.<br />
<br />
Derselbe Algorithmus lässt sich analog für einen maximalen Spannbaum anwenden. Sei <math>G=(V,E,w)</math> etwa ein zusammenhängender kantengewichteter Graph. Dann gibt man <math>G'=(V,E,w')</math> mit <math>w'(e) = s - w(e)</math>, <math>s \in \mathbb{N}</math> und <math>\forall e \in E \,: s > w(e)</math> im Algorithmus von Kruskal ein. Als Ausgabe erhält man schließlich einen minimalen Spannbaum von <math>G'</math> und somit einen maximalen von <math>G</math>.<br />
<br />
Zum Testen, ob Knoten <math>u</math> und <math>v</math> in unterschiedlichen Teilbäumen sind, kann eine [[Union-Find-Struktur]] verwendet werden. Dann ergibt sich eine Laufzeit von <math>O(T_{sort}(|E|) + |E| \cdot \alpha(|V|))</math>. Dabei ist <math>T_{sort}</math> die Zeit, die zum Sortieren der Kantengewichte benötigt wird und <math>\alpha(\cdot))</math> das Inverse der [[Ackermannfunktion]]. Für realistische Eingaben ist <math>\alpha(|V|)</math> immer kleiner oder gleich <math>5</math><br />
<br />
=== Programmierung ===<br />
Das folgende Beispiel in der [[Programmiersprache]] [[C++]] zeigt die Implementierung eines [[Ungerichteter Graph|ungerichteten Graphen]] mit einem Array von [[Kante (Graphentheorie)|Kanten]]. Der ungerichtete Graph wird als [[Klasse (Objektorientierung)|Klasse]] ''UndirectedGraph'' deklariert. Bei der Ausführung des Programms wird die [[Methode (Programmierung)|Methode]] ''main'' verwendet, die die Kanten und Kantengewichte eines minimalen Spannbaums auf der Konsole ausgibt. Die [[Funktion (Programmierung)|Funktion]] ''unionSubsets'' verwendet ''[[Union-Find-Struktur#Union by size und Union by rank|union by rank]]'', um zwei [[Teilmenge|Teilmengen]] von Kanten des Graphen zu vereinigen.<ref>GeeksforGeeks: [https://www.geeksforgeeks.org/kruskals-minimum-spanning-tree-algorithm-greedy-algo-2/ Kruskal’s Minimum Spanning Tree Algorithm]</ref><syntaxhighlight lang="c++"><br />
#include <iostream><br />
#include <sstream><br />
using namespace std;<br />
<br />
// Deklariert den Datentyp für die Knoten des Graphen<br />
struct Node<br />
{<br />
int index;<br />
string value;<br />
Node* next;<br />
};<br />
<br />
// Deklariert den Datentyp für die Kanten des Graphen<br />
struct Edge<br />
{<br />
int startIndex;<br />
int endIndex;<br />
int weight;<br />
};<br />
<br />
// Deklariert die Klasse für den ungerichteten Graphen<br />
class UndirectedGraph<br />
{<br />
public:<br />
int numberOfVertices;<br />
Edge* edges; // Pointer auf das Array für die Kanten<br />
};<br />
<br />
// Deklariert die Klasse für Teilmengen (Teilbäume) der Kantenmenge des ungerichteten Graphen<br />
class subset<br />
{<br />
public:<br />
int parent; // Index der Wurzel<br />
int rank; // Rang der Teilmenge<br />
};<br />
<br />
// Diese rekursive Funktion gibt den Index der Wurzel der Teilmenge (Teilbaum) mit dem Index i zurück<br />
int find(subset subsets[], int i)<br />
{<br />
// Setzt Index der Wurzel auf den Index der Wurzel der Teilmenge mit dem Index i<br />
if (subsets[i].parent != i)<br />
{<br />
subsets[i].parent = find(subsets, subsets[i].parent); // Rekursiver Aufruf der Funktion<br />
}<br />
return subsets[i].parent;<br />
}<br />
<br />
// Diese Methode bildet die Vereinigungsmenge der zwei Teilmengen (Teilbäume) mit den Indexen index1 und index2<br />
void unionSubsets(subset subsets[], int index1, int index2)<br />
{<br />
int newIndex1 = find(subsets, index1); // Index der Teilmenge mit dem Index index1<br />
int newIndex2 = find(subsets, index2); // Index der Teilmenge mit dem Index index2<br />
// Hängt den Teilbaum mit dem niedrigeren Rang unter die Wurzel des Baums mit dem höheren Rang<br />
if (subsets[newIndex1].rank < subsets[newIndex2].rank)<br />
{<br />
subsets[newIndex1].parent = newIndex2;<br />
}<br />
else if (subsets[newIndex1].rank > subsets[newIndex2].rank)<br />
{<br />
subsets[newIndex2].parent = newIndex1;<br />
}<br />
else // Wenn die Teilbäume denselben Rang haben, wird der Rang des einen Baums erhöht und der andere Baum unter die Wurzel des anderen Baums gehängt<br />
{<br />
subsets[newIndex2].parent = newIndex1;<br />
subsets[newIndex1].rank++;<br />
}<br />
}<br />
<br />
// Diese Funktion vergleicht die Gewichte der Kanten edge1 und edge2<br />
int compare(const void* edge1, const void* edge2)<br />
{<br />
return ((Edge*)edge1)->weight > ((Edge*)edge2)->weight; // Gibt 1 zurück, wenn der Vergleich true ergibt. Gibt 0 zurück, wenn der Vergleich false ergibt. <br />
}<br />
<br />
// Diese Funktion verwendet den Algorithmus von Kruskal und gibt den minimalen Spannbaum zurück<br />
Edge* getMSTByKruskal(UndirectedGraph* graph)<br />
{<br />
Edge* edges = graph->edges; // Pointer auf das Array für die Kanten<br />
int numberOfVertices = graph->numberOfVertices; // Variable für die Anzahl der Knoten<br />
int numberOfEdges = sizeof(edges); // Variable für die Anzahl der Kanten<br />
<br />
Edge* minimalSpanningTree = new Edge[numberOfVertices]; // Deklariert ein Array für die Kanten, das als Ergebnis der Methode zurückgegeben wird<br />
int currentIndex = 0; // Aktueller Kantenindex<br />
int nextIndex = 0; // Kantenindex für die nächste Iteration<br />
qsort(edges, numberOfEdges, sizeof(edges[0]), compare); // Sortiert das Array edges der Kanten mit der C++-Standardfunktion qsort (Sortierverfahren Quicksort) und der oben definierten Vergleichsfunktion compare<br />
<br />
subset* subsets = new subset[numberOfVertices]; // Deklariert ein Array für die Teilmengen der Kantenmenge<br />
for (int i = 0; i < numberOfVertices; i++) // for-Schleife, die Teilmengen mit einzelnen Kanten erzeugt<br />
{<br />
subsets[i].parent = i;<br />
subsets[i].rank = 0;<br />
}<br />
while (currentIndex < numberOfVertices - 1 && nextIndex < numberOfEdges) // So lange der aktuelle Kantenindex kleiner als die Anzahl der Knoten minus 1 ist<br />
{<br />
Edge nextEdge = edges[nextIndex++]; // Weist die verbleibende Kante mit dem kleinsten Kantengewicht zu und erhöht den Kantenindex für die nächste Iteration um 1<br />
int index1 = find(subsets, nextEdge.startIndex); // Index der Wurzel der Teilmenge mit dem Index nextEdge.startIndex<br />
int index2 = find(subsets, nextEdge.endIndex); // Index der Wurzel der Teilmenge mit dem Index nextEdge.endIndex<br />
if (index1 != index2) // Wenn die Kante keinen Zyklus erzeugt<br />
{<br />
minimalSpanningTree[currentIndex++] = nextEdge; // Fügt die Kante dem minimalen Spannbaum hinzu<br />
unionSubsets(subsets, index1, index2); // Methodenaufruf, der die Vereinigungsmenge der zwei Mengen mit den Indexen index1 und index2 bildet<br />
}<br />
}<br />
return minimalSpanningTree;<br />
}<br />
<br />
// Gibt die Kanten, die Gewichte und das gesamte Kantengewicht des minimalen Spannbaums auf der Konsole aus<br />
string MSTtoString(Edge* minimalSpanningTree)<br />
{<br />
stringstream text;<br />
int weight = 0;<br />
for (int i = 0; i < sizeof(minimalSpanningTree) - 1; i++)<br />
{<br />
Edge edge = minimalSpanningTree[i];<br />
text << "(" << edge.startIndex << ", " << edge.endIndex << "), Gewicht: " << edge.weight << endl;<br />
weight += edge.weight;<br />
}<br />
text << "Kantengewicht des minimalen Spannbaums: " << weight << endl;<br />
return text.str(); // Typumwandlung von stringstream nach string<br />
}<br />
<br />
// Hauptfunktion die das Programm ausführt<br />
int main()<br />
{<br />
// Deklariert und initialisiert ein Array mit 5 Kanten<br />
Edge* edges = new Edge[5];<br />
edges[0].startIndex = 0;<br />
edges[0].endIndex = 1;<br />
edges[0].weight = 10;<br />
edges[1].startIndex = 0;<br />
edges[1].endIndex = 2;<br />
edges[1].weight = 6;<br />
edges[2].startIndex = 0;<br />
edges[2].endIndex = 3;<br />
edges[2].weight = 5;<br />
edges[3].startIndex = 1;<br />
edges[3].endIndex = 3;<br />
edges[3].weight = 15;<br />
edges[4].startIndex = 2;<br />
edges[4].endIndex = 3;<br />
edges[4].weight = 4;<br />
<br />
// Erzeugt den ungerichteten Graphen mit den gegebenen Kanten<br />
UndirectedGraph* undirectedGraph = new UndirectedGraph;<br />
undirectedGraph->edges = edges;<br />
undirectedGraph->numberOfVertices = 4;<br />
Edge* minimalSpanningTree = getMSTByKruskal(undirectedGraph); // Aufruf der Methode, die einen Pointer auf das Array von Kanten zurückgibt<br />
cout << MSTtoString(minimalSpanningTree); // Aufruf der Methode, die das Ergebnis auf der Konsole ausgibt<br />
}<br />
</syntaxhighlight><br />
<br />
=== Varianten ===<br />
==== Paralleles Sortieren ====<br />
Das Sortieren der ersten Phase kann parallelisiert werden. In der zweiten Phase ist es für die Korrektheit jedoch wichtig, dass die Kanten nacheinander abgearbeitet werden. Mit <math>O(log |V|)</math> Prozessoren kann in linearer Zeit parallel sortiert werden. Dadurch sinkt die Gesamtlaufzeit auf <math>O(|E| \cdot \alpha(|V|))</math>.<br />
<br />
==== Filter-Kruskal ====<br />
Eine Variante des Algorithmus von Kruskal namens Filter-Kruskal wurde von Osipov et al.<ref name="osipov2009" /> beschrieben und eignet sich besser zur Parallelisierung. Die grundlegende Idee besteht darin, die Kanten in ähnlicher Weise wie bei [[Quicksort]] zu partitionieren und anschließend Kanten auszusortieren, welche Knoten im gleichen Teilbaum verbinden, um somit die Kosten für die weitere Sortierung zu verringern. Filter-Kruskal eignet sich besser zur Parallelisierung, da das Sortieren, Partitionieren und Filtern einfach parallel ausgeführt werden können, indem die Kanten zwischen den Prozessoren aufgeteilt werden. Der Algorithmus wird im folgenden Pseudocode dargestellt.<br />
<br />
filterKruskal(<math>G</math>):<br />
'''falls''' <math>|E| <</math> KruskalSchwellwert:<br />
'''return''' kruskal(<math>G</math>)<br />
pivot = zufällige Kante aus <math>E</math><br />
<math>(E_{\leq}</math>, <math>E_{>}) \gets </math>partition(<math>E</math>, pivot)<br />
<math>A \gets</math> filterKruskal(<math>E_{\leq}</math>)<br />
<math>E_{>} \gets</math> filter(<math>E_{>}</math>)<br />
<math>A \gets A</math> <math>\cup</math> filterKruskal(<math>E_{>}</math>)<br />
'''return''' <math>A</math><br />
<br />
partition(<math>E</math>, pivot):<br />
<math>E_{\leq} \gets \emptyset </math><br />
<math>E_{>} \gets \emptyset</math><br />
'''für alle''' <math>(u, v) \in E</math>:<br />
'''falls''' gewicht(<math>u, v</math>) <math>\leq</math> gewicht(pivot):<br />
<math>E_{\leq} \gets E_{\leq} \cup {(u, v)}</math><br />
'''sonst'''<br />
<math>E_{>} \gets E_{>} \cup {(u, v)} </math><br />
'''return''' (<math>E_{\leq}</math>, <math>E_{>}</math>)<br />
<br />
filter(<math>E</math>):<br />
<math>E_{filtered} \gets \emptyset </math><br />
'''für alle''' <math>(u, v) \in E</math>:<br />
'''falls''' find-set(u) <math>\neq</math> find-set(v):<br />
<math>E_{filtered} \gets E_{filtered} \cup {(u, v)}</math><br />
'''return''' <math>E_{filtered}</math><br />
<br />
== Korrektheitsbeweis ==<br />
Sei <math>G = (V,E,w)</math> ein zusammenhängender kantengewichteter Graph und <math>M = (V,E')</math> die Ausgabe des Algorithmus von Kruskal. Um nun die Korrektheit des Algorithmus zu beweisen, muss Folgendes gezeigt werden:<br />
# der Algorithmus [[Terminiertheit|terminiert]] (er enthält keine Endlosschleife).<br />
# <math>M</math> ist ein minimaler Spannbaum von <math>G</math>, also:<br />
## <math>M</math> ist spannender Teilgraph von <math>G</math>.<br />
## <math>M</math> enthält keinen Kreis.<br />
## <math>M</math> ist zusammenhängend.<br />
## <math>M</math> ist bezüglich <math>G</math> minimal.<br />
<br />
Im Nachstehenden folgen einige Beweisideen, die die Gültigkeit der einzelnen Aussagen darlegen:<br />
; Terminierung: Durch Zeile 6 wird in jedem Schleifendurchlauf genau ein Element aus <math>L</math> entfernt. Außerdem wird <math>L</math> durch keine weitere Operation verändert. Aus <math>L</math> werden wegen Zeile 4 nur solange Elemente entfernt, bis <math>L = \emptyset</math>. Da zu Beginn im Algorithmus <math>L = E</math> gesetzt wurde und <math>E</math> nach Definition nur endlich ist, wird auch die Schleife nur endlich oft durchlaufen. Daraus folgt, dass Kruskals Algorithmus terminiert.<br />
; M ist aufspannender Teilgraph von G: Da die Menge der Knoten nach Definition des Algorithmus bei <math>M</math> und <math>G</math> gleich ist und wegen Zeile 8 offensichtlich <math>E' \subseteq E</math> gilt, ist <math>M</math> aufspannender Teilgraph von <math>G</math>.<br />
; M enthält keinen Kreis: Dass <math>M</math> keinen Kreis beinhalten kann, ist durch Zeile 7 trivial.<br />
; M ist zusammenhängend: Im Folgenden wird indirekt gezeigt, dass <math>M</math> zusammenhängend ist. Sei <math>M</math> also nicht zusammenhängend. Dann gibt es in <math>M</math> zwei Knoten <math>x</math> und <math>y</math>, die nicht durch einen Weg verbunden sind. Da aber <math>x</math> und <math>y</math> in <math>G</math> durch einen Weg verbunden sind, existiert eine Kante <math>k</math> in <math>G</math>, welche nicht in <math>M</math> vorhanden ist. Der Algorithmus betrachtet in Zeile 7 garantiert jede Kante aus <math>G</math> und damit auch <math>k</math>. Der Graph <math>(V,E' \cup \lbrace k \rbrace)</math> in Zeile 7 muss kreisfrei sein, da es zwischen <math>x</math> und <math>y</math> in <math>M=(V,E')</math> keinen Weg gibt. Mit Zeile 8 wird <math>k</math> dann in <math>M</math> eingefügt. Dies widerspricht allerdings der Tatsache, dass <math>k</math> nicht in <math>M</math> enthalten ist. Somit ist unsere Annahme hinfällig und <math>M</math> doch zusammenhängend.<br />
; M ist bezüglich G minimal: Wir zeigen durch Induktion, dass für <math>k=0,...,n</math> die folgende Behauptung wahr ist:<br />
Wenn <math>F</math> die Kantenmenge ist, die im <math>k</math>-ten Schritt des Algorithmus erzeugt wurde, dann gibt es einen minimalen Spannbaum, der <math>F</math> enthält.<br />
Die Behauptung ist für <math>k=0</math> wahr, d.&nbsp;h. <math>F = \emptyset</math> (d.&nbsp;h., es ist noch keine Kante eingeplant). Jeder minimale Spannbaum erfüllt die Behauptung und es existiert ein minimaler Spannbaum, da ein gewichteter, zusammenhängender Graph immer einen minimalen Spannbaum besitzt.<br />
Jetzt nehmen wir an, dass die Behauptung für <math>0 \le k < n</math> erfüllt ist und <math>F</math> die vom Algorithmus nach Schritt <math>k</math> erzeugte Kantenmenge ist. Es sei <math>M</math> der minimale Spannbaum, der <math>F</math> enthält.<br />
Wir betrachten jetzt den Fall <math>k+1</math>. Dafür sei <math>e</math> die letzte vom Algorithmus eingefügte Kante.<br />
; Falls <math>e \in M</math>: Dann ist die Behauptung auch für <math>F+e</math> erfüllt, da der minimale Spannbaum <math>F</math> um eine Kante aus dem minimalen Spannbaum <math>M</math> erweitert wird.<br />
; Falls <math>e \notin M</math>: Dann enthält <math>M+e</math> einen Kreis und es gibt eine Kante <math>f</math>, die im Kreis, aber nicht in <math>F</math> liegt. (Wenn es keine solche Kante <math>f</math> geben würde, dann hätte <math>e</math> nicht zu <math>F</math> hinzufügt werden können, da dann ein Kreis entstanden wäre.) Damit ist <math>M-f+e</math> ein Baum. Weiterhin kann das Gewicht von <math>f</math> nicht geringer als das Gewicht von <math>e</math> sein, da sonst der Algorithmus <math>f</math> anstelle von <math>e</math> hinzugefügt hätte. Mit <math>w(e) \le w(f)</math> folgt, dass <math>w(M-f+e) \le w(M)</math> gilt. Da aber <math>M</math> minimaler Spannbaum ist, gilt außerdem <math>w(M) \le w(M-f+e)</math> und daraus folgt <math>w(M-f+e) = w(M)</math>. Somit ist <math>M-f+e</math> ein minimaler Spannbaum, der <math>F+e</math> enthält, und die Behauptung ist erfüllt.<br />
<br />
Damit folgt für <math>k=n</math>, dass der Kruskal-Algorithmus nach <math>n</math> Schritten eine Menge <math>F</math> erzeugt, die zu einem minimalen Spannbaum erweitert werden kann. Da aber das Ergebnis nach <math>n</math> Schritten des Algorithmus bereits ein Baum ist (wie oben gezeigt wurde), muss dieser minimal sein.<br />
<br />
== Zeitkomplexität ==<br />
Im Folgenden sei <math>\left|E\right|</math> die Anzahl der Kanten und <math>\left|V\right|</math> die Anzahl der Knoten. Die [[Zeitkomplexität|Laufzeit]] des Algorithmus setzt sich zusammen aus dem notwendigen [[Sortierverfahren|Sortieren]] der Kanten nach ihrem Gewicht und dem Überprüfen, ob der Graph kreisfrei ist.<br />
Das Sortieren benötigt eine Laufzeit von <math>\mathcal{O}\bigl(\left|E\right| \cdot \log(\left|E\right|)\bigr)</math>. Bei einer geeigneten Implementierung ist das Überprüfen auf Kreisfreiheit schneller möglich, so dass das Sortieren die Gesamtlaufzeit bestimmt. Insbesondere bei Graphen mit vielen Kanten ist insofern der [[Algorithmus von Prim]] effizienter.<br />
<br />
Wenn die Kanten bereits vorsortiert sind, arbeitet der Algorithmus von Kruskal schneller. Man betrachtet nun, wie schnell das Überprüfen auf Kreisfreiheit möglich ist. Um eine bestmögliche Laufzeit zu erreichen, speichert man alle Knoten in einer [[Union-Find-Struktur]]. Diese enthält Informationen darüber, welche Knoten zusammenhängen. Zu Beginn ist noch keine Kante in den Spannbaum eingetragen, daher ist jeder Knoten für sich in einer einzelnen [[Partition (Mengenlehre)|Partition]]. Wenn eine Kante <math>(v_1,v_2)</math> hinzugefügt werden soll, wird überprüft, ob <math>v_1</math> und <math>v_2</math> in verschiedenen Partitionen liegen. Dazu dient die Operation ''Find(x)'': Sie liefert einen Repräsentanten der Partition, in dem der Knoten&nbsp;x liegt. Wenn Find(<math>v_1</math>) und Find(<math>v_2</math>) verschiedene Ergebnisse liefern, dann kann die Kante hinzugefügt werden und die Partitionen der beiden Knoten werden vereinigt (''Union''). Ansonsten würde durch Hinzunehmen der Kante ein Kreis entstehen, die Kante wird also verworfen.<br />
Insgesamt wird die Operation ''Find'' <math>2\cdot \left|E\right|</math> (für jede Kante) und die Operation ''Union'' <math>\left|V\right|-1</math> mal aufgerufen.<br />
Bei Verwenden der Heuristiken [[Union-By-Size]] und [[Pfadkompression]] ergibt eine [[amortisierte Laufzeitanalyse]] für den Algorithmus eine Komplexität von <math>\mathcal{O}(\left|E\right| \cdot \log^* \left|V\right|)</math>. Dabei ist <math>\log^*(n)</math> definiert als<br />
:<math>\min \Bigl\{s\in\mathbb{N} \mid \underbrace{\log\bigl(\log(\ldots\log(n)\ldots)\bigr)}_{s\text{-mal}} \le 1 \Bigr\}</math><br />
und praktisch konstant. Theoretisch wächst diese Funktion jedoch unendlich, weshalb sie in der O-Notation nicht weggelassen werden kann.<br />
<br />
== Parallele Implementierung ==<br />
Aufgrund von Datenabhängigkeiten zwischen den Iterationen lässt sich der Algorithmus von Kruskal grundsätzlich schwer parallelisieren. Es ist jedoch möglich, das Sortieren der Kanten zu Beginn parallel auszuführen oder alternativ eine parallele Implementation eines [[Binärer Heap|Binären Heaps]] zu verwenden um in jeder Iteration die Kante mit dem kleinsten Gewicht zu finden<ref>{{Cite journal|last1=Quinn|first1=Michael J.|last2=Deo|first2=Narsingh|date=1984|title=Parallel graph algorithms|url=|journal=ACM Computing Surveys (CSUR) 16.3|volume=|pages=319–348}}</ref>. Durch paralleles Sortieren, was auf <math>O(n \cdot \log n)</math> Prozessoren in <math>O(n)</math> Zeit möglich ist<ref>{{cite book|title=Introduction to Parallel Computing|last1=Grama|first1=Ananth|last2=Gupta|first2=Anshul|last3=Karypis|first3=George|last4=Kumar|first4=Vipin|publisher=|year=2003|isbn=978-0-201-64865-2|location=|pages=412–413}}</ref>, kann die Laufzeit des Algorithmus auch bei zuvor unsortierten Kanten auf <math>O(|E| \cdot \log^*|V|)</math> reduziert werden.<br />
<br />
Eine Variante des Algorithmus von Kruskal namens Filter-Kruskal wurde von Osipov et al.<ref name="osipov2009">{{Cite journal|last1=Osipov|first1=Vitaly|last2=Sanders|first2=Peter|last3=Singler|first3=Johannes|date=2009|title=The filter-kruskal minimum spanning tree algorithm|url=|journal=Proceedings of the Eleventh Workshop on Algorithm Engineering and Experiments (ALENEX). Society for Industrial and Applied Mathematics|volume=|pages=52–61}}</ref> beschrieben und eignet sich besser zur Parallelisierung. Die grundlegende Idee besteht darin, die Kanten in ähnlicher Weise wie bei [[Quicksort]] zu partitionieren und anschließend Kanten auszusortieren, welche Knoten im gleichen Teilbaum verbinden, um somit die Kosten für die Sortierung zu verringern. Der Algorithmus wird im folgenden [[Pseudocode]] dargestellt.<br />
<br />
FILTER-KRUSKAL(G):<br />
1 '''if''' |G.E| < KruskalThreshhold:<br />
2 '''return''' KRUSKAL(G)<br />
3 pivot = CHOOSE-RANDOM(G.E)<br />
4 <math>E_{<=}</math>, <math>E_{>}</math> = PARTITION(G.E, pivot)<br />
5 A = FILTER-KRUSKAL(<math>E_{<=}</math>)<br />
6 <math>E_{>}</math> = FILTER(<math>E_{>}</math>)<br />
7 A = A ∪ FILTER-KRUSKAL(<math>E_{>}</math>)<br />
8 '''return''' A<br />
<br />
PARTITION(E, pivot):<br />
1 <math>E_{<=}</math> = ∅, <math>E_{>}</math> = ∅<br />
2 '''foreach''' (u, v) in E:<br />
3 '''if''' weight(u, v) <= pivot:<br />
4 <math>E_{<=}</math> = <math>E_{<=}</math> ∪ {(u, v)}<br />
5 '''else'''<br />
6 <math>E_{>}</math> = <math>E_{>}</math> ∪ {(u, v)}<br />
5 '''return''' <math>E_{<=}</math>, <math>E_{>}</math><br />
<br />
FILTER(E):<br />
1 <math>E_{filtered}</math> = ∅<br />
2 '''foreach''' (u, v) in E:<br />
3 '''if''' FIND-SET(u) ≠ FIND-SET(v):<br />
4 <math>E_{filtered}</math> = <math>E_{filtered}</math> ∪ {(u, v)}<br />
5 '''return''' <math>E_{filtered}</math><br />
<br />
Filter-Kruskal eignet sich besser zur Parallelisierung, da sowohl das Sortieren und Partitionieren, als auch das Filtern einfach parallel ausgeführt werden kann, indem die Kanten zwischen den Prozessoren aufgeteilt werden.<ref name="osipov2009" /><br />
<br />
Weitere Varianten für eine Parallelisierung von Kruskals Algorithmus sind ebenfalls möglich. So besteht zum Beispiel die Möglichkeit, den sequentiellen Algorithmus auf mehreren Teilgraphen parallel auszuführen, um diese dann zusammenzuführen bis schlussendlich nur noch der finale minimale Spannbaum übrigbleibt<ref>{{Cite journal|last1=Lončar|first1=Vladimir|last2=Škrbić|first2=Srdjan|last3=Balaž|first3=Antun|date=2014|title=Parallelization of Minimum Spanning Tree Algorithms Using Distributed Memory Architectures|url=|journal=Transactions on Engineering Technologies.|volume=|pages=543–554}}</ref>. Eine simplere Form des Filter-Kruskals, bei welchem Hilfsthreads benutzt werden, um Kanten, die eindeutig nicht Teil des minimalen Spannbaums sind, im Hintergrund zu entfernen, kann ebenfalls verwendet werden<ref>{{Cite journal|last1=Katsigiannis|first1=Anastasios|last2=Anastopoulos|first2=Nikos|last3=Konstantinos|first3=Nikas|last4=Koziris|first4=Nectarios|date=2012|title=An approach to parallelize kruskal’s algorithm using helper threads|url=|journal=Parallel and Distributed Processing Symposium Workshops & PhD Forum (IPDPSW), 2012 IEEE 26th International|volume=|pages=1601–1610}}</ref>.<br />
<br />
== Sonstiges ==<br />
Der Algorithmus diente Kruskal ursprünglich als Hilfsmittel für einen vereinfachten Beweis, dass ein Graph mit paarweise verschiedenen Kantengewichten einen eindeutigen minimalen Spannbaum besitzt.<br />
<br />
== Weblinks ==<br />
{{Wikibooks|Algorithmensammlung: Graphentheorie: Algorithmus von Kruskal|Algorithmus von Kruskal|suffix=Implementierungen in der Algorithmensammlung}}<br />
* [http://web-old.archive.org/web/20160314221605/http://www-m9.ma.tum.de/graph-algorithms/mst-kruskal/index_de.html Interaktives Applet zum Lernen, Ausprobieren und Demonstrieren des Algorithmus]<br />
* Ronny Harbich: [http://www.uni-magdeburg.de/harbich/mst.php Vollständiger Beweis zur Korrektheit des Algorithmus von Kruskal.] 2006<br />
* [http://web-old.archive.org/web/20160127080051/http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo21.php Anschauliche Darstellung des Algorithmus im Rahmen des Informatikjahres 2006]<br />
<br />
== Einzelnachweise ==<br />
<references /><br />
<br />
[[Kategorie:Optimierungsalgorithmus|Kruskal]]<br />
[[Kategorie:Graphsuchalgorithmus|Kruskal]]</div>Optimalsloth