https://de.wikipedia.org/w/api.php?action=feedcontributions&feedformat=atom&user=Flowi Wikipedia - Benutzerbeiträge [de] 2025-04-17T16:23:18Z Benutzerbeiträge MediaWiki 1.44.0-wmf.24 https://de.wikipedia.org/w/index.php?title=Matching_(Graphentheorie)&diff=161788284 Matching (Graphentheorie) 2017-01-19T13:21:40Z <p>Flowi: Algo von Dinic hat dieselbe Laufzeit wie Hopcroft-Karp auf Flussnetzwerken, wie sie beim bip. Matching auftreten (Quelle: Even&amp;Tarjan, auch hinzugefügt)</p> <hr /> <div>{{Weiterleitungshinweis|Perfekte Paarung|für den Begriff der nicht-ausgearteten Bilinearform aus der linearen Algebra siehe [[ausgeartete Bilinearform]].}}<br /> Die Theorie um das Finden von '''Matchings''' in Graphen ist in der [[Diskrete Mathematik|diskreten Mathematik]] ein umfangreiches Teilgebiet, das in die [[Graphentheorie]] eingeordnet wird.<br /> <br /> Folgende Situation wird dabei betrachtet: Gegeben eine Menge von Dingen und zu diesen Dingen Informationen darüber, welche davon einander zugeordnet werden könnten. Ein Matching (in der Literatur manchmal auch '''Paarung''') ist dann als eine solche Auswahl aus den möglichen Zuordnungen definiert, die kein Ding mehr als einmal zuordnet.<br /> <br /> Die am häufigsten gestellten Fragen in dieser Situation sind dann die folgenden:<br /> # Wie findet man ein Matching, das eine maximale Anzahl&lt;ref group=&quot;A&quot;&gt;Beachte den Unterschied zwischen einem [[Maximales Element|maximalen Element]] und einem [[größtes Element|Maximum]]. Bei der [[#Formalisierung|Formalisierung]] wird darauf genauer eingegangen.&lt;/ref&gt; an Dingen einander zuordnet?&lt;br /&gt;Dieses Problem ist das ''klassische Matchingproblem.''<br /> # Gibt es ein Matching, das alle Dinge zuordnet? Wenn ja, wie viele?&lt;br /&gt;Solche Matchings heißen ''perfektes Matching.'' Die Anzahl der perfekten Matchings in einem Graphen &lt;math&gt;G&lt;/math&gt; wird meistens mit &lt;math&gt;\Phi(G)&lt;/math&gt; notiert.<br /> # Angenommen, man könnte quantifizieren „wie wichtig“ (oder „teuer“) die einzelnen Zuordnungen wären: Wie findet man dann ein Matching, das eine maximale Zahl von Dingen zuordnet und dabei ein möglichst großes (oder kleines) Gewicht hat?&lt;br /&gt;Dieses Problem heißt ''gewichtetes Matchingproblem.'' Zwischen einer Maximierungs- und einer Minimierungsaufgabe wird hier oftmals nicht unterschieden: Indem man bei allen Gewichten (Kosten) das [[Vorzeichen (Zahl)|Vorzeichen]] vertauscht, kann man beide Probleme ohne nennenswerten Aufwand ineinander überführen.<br /> # Angenommen, man hätte genau zwei Klassen von Dingen und angenommen, man wüsste, dass es ausschließlich zwischen diesen Klassen mögliche Zuordnungen gibt. Werden die Probleme 1–3 dadurch einfacher?&lt;br /&gt;Dieses Problem heißt ''[[Bipartiter Graph|bipartites]] (gewichtetes) Matchingproblem'' und ist ein viel diskutierter Spezialfall.<br /> # Kann man anderes Wissen, das man über die Struktur der möglichen Zuordnungen hat, ähnlich wie in 4 geschickt benutzen, um die Probleme 1–3 effizienter zu lösen?<br /> <br /> Die Theorie um die Matchings untersucht möglichst effiziente Lösungsverfahren dieser Probleme, klassifiziert diese nach ihrer „Schwierigkeit“ mit den Methoden der [[Komplexitätstheorie]] und stellt Beziehungen dieser Probleme zueinander und zu anderen Problemen in der Mathematik her.<br /> <br /> == Definitionen ==<br /> &lt;gallery class=&quot;float-right&quot;&gt;<br /> maximal-simple.svg|Ein einfacher Graph mit einem nicht erweiterbaren Matching (maximal matching)<br /> perfect-simple.svg|Derselbe Graph mit einem perfekten (wie auch größtmöglichen) Matching<br /> &lt;/gallery&gt;<br /> Das oben beschriebene Problem lässt sich wie folgt formalisieren. Gegeben sei ein endlicher, ungerichteter Graph &lt;math&gt;G=(V,E)&lt;/math&gt;. Eine Menge &lt;math&gt;M\subseteq E&lt;/math&gt; heißt (gültiges) Matching wenn keine zwei Kanten aus &lt;math&gt;M&lt;/math&gt; einen Knoten gemeinsam haben. Ein Matching heißt<br /> ; nicht erweiterbar (engl. maximal matching): falls es keine Kante &lt;math&gt;e\in E\setminus M&lt;/math&gt; derart gibt, dass &lt;math&gt;\{e\}\cup M&lt;/math&gt; ein gültiges Matching ist. Maximale Matchings sind im Vergleich zu den folgenden Begriffen sehr einfach zu berechnen.<br /> ; größtmöglich (engl. maximum matching): falls &lt;math&gt;M&lt;/math&gt; als Menge eine maximale Kardinalität unter allen gültigen Matchings von &lt;math&gt;G&lt;/math&gt; hat. Maximum-Matchings sind maximal. Die Mächtigkeit eines Maximum-Matchings wird ''Matchingzahl'' genannt und mit &lt;math&gt;\nu(G)&lt;/math&gt; notiert.<br /> ; perfekt: falls &lt;math&gt;2 \cdot | M | = | V |&lt;/math&gt; gilt. Perfekte Matchings sind Maximum-Matchings (und damit auch maximal). Perfekte Matchings können als ''[[Graph Faktor|1-Faktoren]]'' eines Graphen, das heißt [[Regulärer Graph|1-reguläre]] aufspannende Teilgraphen, aufgefasst werden. Dieser Auffassung folgend spricht man auch von ''faktorisierbaren Graphen,'' wenn sie einen 1-Faktor besitzen. Beide Sprechweisen sind etwa gleich weit verbreitet.&lt;ref&gt;[[#Yu &amp; Liu|Yu &amp; Liu]] ''4.''&lt;/ref&gt;<br /> <br /> Für das gewichtete Matchingproblem spielt eine Kostenfunktion &lt;math&gt;c: E\to \mathbb{R}&lt;/math&gt; eine Rolle. Ein gültiges Matching heißt dann …<br /> ; von maximalem Gewicht: falls &lt;math&gt;c(M) := \sum_{e\in M} c(e)&lt;/math&gt; maximal unter allen gültigen Matchings von &lt;math&gt;G&lt;/math&gt; ist.<br /> ; minimal maximal: falls &lt;math&gt;c(M)&lt;/math&gt; minimal unter allen maximalen Matchings ist.<br /> <br /> == Historisches ==<br /> [[Datei:Sylvester counter.svg|mini|[[James Joseph Sylvester|Sylvester]] gab für Aussage (2) ein Beispiel an, das zeigt, dass sie für Graphen mit drei oder mehr Brücken nicht mehr stimmt: ein 3-regulärer Graph mit 16 Knoten, drei Brücken und keinem perfekten Matching.]]<br /> Als eine der frühesten&lt;ref name=&quot;ReferenceA&quot;&gt;[[#Lovász &amp; Plummer|Lovász &amp; Plummer]] ''xi.''&lt;/ref&gt;&lt;ref&gt;[[#Yu &amp; Liu|Yu &amp; Liu]] ''3.''&lt;/ref&gt; systematischen Untersuchungen von Matchings wird ein Artikel von [[Julius Peter Christian Petersen|Julius Petersen]] angeführt, der 1891 über „Die Theorie der regulären graphs“ schrieb.&lt;ref&gt;{{Cite journal<br /> | volume = 15<br /> | pages = 193–220<br /> | last = Petersen<br /> | first = Julius<br /> | title = Die Theorie der regulären graphs<br /> | journal = [[Acta Mathematica]]<br /> | date = 1891<br /> | doi = 10.1007/BF02392606<br /> }}&lt;/ref&gt; Er untersuchte ein Zerlegungsproblem aus der Algebra, das [[David Hilbert]] 1889&lt;ref&gt;{{Cite journal<br /> | volume = 33<br /> | issue = 2<br /> | pages = 223–226<br /> | last = Hilbert<br /> | first = David<br /> | authorlink = David Hilbert<br /> | title = Über die Endlichkeit des Invariantensystems für binäre Grundformen<br /> | journal = Mathematische Annalen<br /> | date = 1889<br /> }}&lt;/ref&gt; gestellt hatte, indem er es als Graphenproblem formulierte.&lt;ref name=&quot;ReferenceA&quot; /&gt; Letztlich bewies er darin folgendes:<br /> : Für alle Zahlen &lt;math&gt;k\in \mathbb{N}&lt;/math&gt; kann jeder &lt;math&gt;2k&lt;/math&gt;-reguläre Graph in disjunkte &lt;math&gt;2&lt;/math&gt;-Faktoren zerlegt werden. (1)<br /> : Jeder [[Kubischer Graph|kubische]], zusammenhängende Graph mit weniger als drei Brücken besitzt ein perfektes Matching. (2)<br /> Die Tatsache (2), bekannt als [[Satz von Petersen]], lässt sich auch als eine leichte Verallgemeinerung des [[Eulerkreisproblem]]s formulieren.&lt;ref group=&quot;A&quot;&gt;Es ist nicht bekannt, ob Petersen mit den Arbeiten von [[Leonhard Euler|Euler]] 1736 zu diesem Problem vertraut war ([[#Lovász &amp; Plummer|Lovász &amp; Plummer]] ''xi'').&lt;/ref&gt;<br /> <br /> Rückblickend erscheinen Petersens Argumente, mit denen er das Obige bewies, kompliziert und umständlich.&lt;ref name=&quot;Diestel-43&quot;&gt;{{Cite book<br /> | edition = 3., neu bearb. und erw. A.<br /> | publisher = Springer, Berlin<br /> | isbn = 3-540-21391-0<br /> | last = Diestel<br /> | first = Reinhard<br /> | title = Graphentheorie<br /> | date = 2006<br /> | pages = 43<br /> | url = http://diestel-graph-theory.com/german/index.html<br /> }}<br /> &lt;/ref&gt; Bei der weiteren Untersuchung etwa durch [[Henry Roy Brahana|Brahana]] 1917&lt;ref&gt;{{Cite journal<br /> | doi = 10.2307/1967667<br /> | issn = 0003-486X<br /> | volume = 19<br /> | issue = 1<br /> | pages = 59–63<br /> | last = Brahana<br /> | first = Henry Roy<br /> | title = A Proof of Petersen’s Theorem<br /> | journal = The Annals of Mathematics<br /> | date = 1917<br /> }}&lt;/ref&gt;, [[Alfred Errera|Errera]] 1922&lt;ref&gt;{{Cite journal<br /> | volume = 36<br /> | pages = 56–61<br /> | last = Errera<br /> | first = Alfred<br /> | title = Une demonstration du théorème de Petersen<br /> | journal = Mathesis<br /> | date = 1922<br /> }}&lt;/ref&gt; und [[Orrin Frink|Frink]] 1926&lt;ref&gt;{{Cite journal<br /> | doi = 10.2307/1967699<br /> | issn = 0003-486X<br /> | volume = 27<br /> | issue = 4<br /> | pages = 491–493<br /> | last = Frink<br /> | first = Orrin<br /> | title = A Proof of Petersen’s Theorem<br /> | journal = The Annals of Mathematics<br /> | date = 1926<br /> }}&lt;/ref&gt; sowie zusammenfassend durch [[Dénes Kőnig|Kőnig]] 1936&lt;ref&gt;{{Cite book<br /> | last = Kőnig<br /> | first = Dénes<br /> | title = Theorie der endlichen und unendlichen Graphen; kombinatorische Topologie der Streckenkomplexe.<br /> | date = 1936<br /> }}&lt;/ref&gt; wurden aber viele Methoden der modernen Graphentheorie entwickelt oder zuerst systematisch formuliert. Petersens Denkansatz wurde dann von [[Fridolin Bäbler|Bäbler]] 1938&lt;ref&gt;{{Cite journal<br /> | doi = 10.1007/BF01214296<br /> | issn = 0010-2571<br /> | volume = 10<br /> | issue = 1<br /> | pages = 275–287<br /> | last = Bäbler<br /> | first = Fridolin<br /> | title = Über die Zerlegung regulärer Streckenkomplexe ungerader Ordnung<br /> | journal = Commentarii Mathematici Helvetici<br /> | date = 1938<br /> }}&lt;/ref&gt; 1952&lt;ref&gt;{{Cite journal<br /> | issn = 0010-2571<br /> | volume = 26<br /> | pages = 117–118<br /> | last = Bäbler<br /> | first = Fridolin<br /> | title = Bemerkungen zu einer Arbeit von Herrn R. Cantoni.<br /> | journal = Commentarii Mathematici Helvetici<br /> | date = 1952<br /> | url = http://www.digizeitschriften.de/dms/img/?PPN=GDZPPN002055910<br /> }}&lt;/ref&gt; und 1954&lt;ref&gt;{{Cite journal<br /> | doi = 10.1007/BF02566927<br /> | issn = 0010-2571<br /> | volume = 28<br /> | issue = 1<br /> | pages = 155–161<br /> | last = Bäbler<br /> | first = Fridolin<br /> | title = Über den Zerlegungssatz von Petersen<br /> | journal = Commentarii Mathematici Helvetici<br /> | date = 1954<br /> }}&lt;/ref&gt; sowie von [[Tibor Gallai|Gallai]] 1950&lt;ref&gt;{{Cite journal<br /> | issn = 0236-5294<br /> | volume = 1<br /> | pages = 133–153<br /> | last = Gallai<br /> | first = Tibor<br /> | title = On factorization of graphs<br /> | journal = Acta Mathematica Academiae Scientiarum Hungaricae<br /> | date = 1950<br /> }}&lt;/ref&gt;, [[Hans-Boris Belck|Belck]] 1950&lt;ref&gt;{{Cite journal<br /> | doi = 10.1515/crll.1950.188.228<br /> | issn = 0075-4102<br /> | volume = 1950<br /> | issue = 188<br /> | pages = 228–252<br /> | last = Belck<br /> | first = Hans-Boris<br /> | title = Reguläre Faktoren von Graphen.<br /> | journal = Journal für die reine und angewandte Mathematik (Crelles Journal)<br /> | date = 1950<br /> }}&lt;/ref&gt; und schließlich Tutte auf andere reguläre Graphen übertragen.<br /> <br /> In modernen Lehrbüchern und Vorlesungen tauchen Petersens ursprüngliche Resultate, wenn überhaupt, meist nur noch als Folgerungen aus den Resultaten von Tutte oder Hall auf. Im Buch von Diestel folgt die erste Aussage aus dem [[Heiratssatz]] von Hall.&lt;ref name=&quot;Diestel-43&quot; /&gt; Die zweite Aussage wird auf den Satz von Tutte zurückgeführt.&lt;ref&gt;{{Cite book<br /> | edition = 3., neu bearb. und erw. A.<br /> | publisher = Springer, Berlin<br /> | isbn = 3-540-21391-0<br /> | last = Diestel<br /> | first = Reinhard<br /> | title = Graphentheorie<br /> | date = 2006<br /> | pages = 45<br /> | url = http://diestel-graph-theory.com/german/index.html<br /> }}&lt;/ref&gt;<br /> <br /> == Bipartite Matchings ==<br /> Eines dieser frühen Resultate betrifft [[Bipartiter Graph|bipartite Graphen]], die sich in der Folge als ein sehr natürlicher und aus heutiger Sicht für die Praxis zentraler Spezialfall herausgestellt haben. Kőnig und Egerváry untersuchten beide unabhängig voneinander das bipartite Matchingproblem und das [[Knotenüberdeckungsproblem]] und fanden dabei heraus, dass beide Probleme in dem folgenden Sinn äquivalent sind:<br /> : Die Größe einer minimalen Knotenüberdeckung und eines maximum Matching stimmen auf bipartiten Graphen überein. (3)<br /> Dieser Satz wird meistens Kőnig zugeschrieben oder ''Min-Max-Theorem'' bzw. ''Dualitätssatz'' genannt. Beide bewiesen die Aussage für endliche Graphen. [[Ron Aharoni|Aharoni]] bewies 1984 die Aussage für [[überabzählbar]] unendliche Graphen.&lt;ref&gt;{{Cite journal<br /> | doi = 10.1112/jlms/s2-29.1.1<br /> | issn = 0024-6107<br /> | volume = s2-29<br /> | issue = 1<br /> | pages = 1–12<br /> | last = Aharoni<br /> | first = Ron<br /> | title = Kőnig’s Duality Theorem for Infinite Bipartite Graphs<br /> | journal = Journal of the London Mathematical Society<br /> | date = 1984<br /> }}&lt;/ref&gt; Ein elementarer Beweis von (3) findet sich in [[#Lovász &amp; Plummer|Lovász &amp; Plummer]] ''43,'' der von den meisten Lehrbüchern übernommen wurde. [[#Bondy &amp; Murty|Bondy &amp; Murty]] ''200'' führt den Satz auf ein Resultat der [[Lineares Programm|linearen Programmierung]] zurück: Ist &lt;math&gt;A&lt;/math&gt; die [[Inzidenzmatrix]] des Graphen &lt;math&gt;G&lt;/math&gt;, dann lassen sich maximum Matchings als Lösungen von folgendem ganzzahligen linearen Programm auffassen:<br /> :&lt;math&gt;\max ex \text{ unter } Ax\le 1 \land x\ge 0&lt;/math&gt;<br /> Dabei ist &lt;math&gt;e&lt;/math&gt; der [[Einsvektor]] bestehend aus lauter Einsen. Das Programm des Knotenüberdeckungsproblems hat folgende Gestalt:<br /> :&lt;math&gt;\min ye \text{ unter } yA\ge 1 \land y\ge 0&lt;/math&gt;<br /> Diese Programme haben eine sogenannte ''primal-dual''-Gestalt. Für Programme von dieser Gestalt wird in der Theorie der linearen Programme gezeigt, dass sie in ihren Optima übereinstimmen. Für bipartite Graphen lässt sich außerdem leicht zeigen, dass &lt;math&gt;A&lt;/math&gt; [[Total unimodulare Matrix|total unimodular]] ist, was in der Theorie der ganzzahligen linearen Programme ein Kriterium für die Existenz einer optimalen Lösung der Programme mit Einträgen nur aus &lt;math&gt;\mathbb{Z}&lt;/math&gt; (und damit in diesem speziellen Fall sogar aus &lt;math&gt;\left\{0, 1\right\}&lt;/math&gt;) ist, also genau solchen Vektoren, die auch für ein Matching bzw. für eine Knotenüberdeckung stehen können. Dieser Primal-Dual-Ansatz der linearen Programme scheint zunächst wenig mit der Matching-Theorie zu tun zu haben, stellt sich aber als einer der fruchtbarsten Ansätze zur effizienten Berechnung von Matchings, insbesondere im gewichteten Fall, heraus.<br /> <br /> Es gibt eine ganze Vielzahl von Sätzen, die zum Satz von Kőnig äquivalent sind.&lt;ref&gt;[[#Lovász &amp; Plummer|Lovász &amp; Plummer]] ''5-40.''&lt;/ref&gt;&lt;ref&gt;Notizen zu einem Vortrag von Robert D. Borgersen: ''[http://www.robertborgersen.info/Presentations/GS-05R-1.pdf Equivalence of seven major theorems in combinatorics.]'' (PDF; 66&amp;nbsp;kB). November 26, 2004.&lt;/ref&gt;&lt;ref&gt;{{Cite journal<br /> | pages = 103–141<br /> | last = Jacobs<br /> | first = K.<br /> | title = Der Heiratssatz<br /> | journal = Selecta Mathematica I<br /> | date = 1969<br /> }}&lt;/ref&gt; Darunter der [[Satz von Birkhoff und von Neumann]], der [[Satz von Dilworth]] und das [[Max-Flow-Min-Cut-Theorem]] für bipartite Graphen. Für die Matchingtheorie am interessantesten ist folgende Bedingung, die [[Philip Hall|Hall]] 1935&lt;ref&gt;{{Cite journal<br /> | volume = 10<br /> | pages = 26–30<br /> | last = Hall<br /> | first = Philip<br /> | title = On representatives of subsets<br /> | journal = Journal of London Mathematics Society<br /> | date = 1935<br /> }}&lt;/ref&gt; angab, um bipartite Graphen mit perfektem Matching zu charakterisieren. Dieser Charakterisierungssatz ist ebenfalls äquivalent zum Satz von Kőnig.<br /> : Ein bipartiter Graph mit Knotenpartitionen &lt;math&gt;S\dot{\cup} T&lt;/math&gt; und [[Ohne Beschränkung der Allgemeinheit|o.B.d.A]] &lt;math&gt;|S|\ge |T|&lt;/math&gt; hat [[Bikonditional|genau dann]] ein perfektes Matching, wenn für jede Auswahl von Knoten &lt;math&gt;H\subseteq S&lt;/math&gt; gilt: &lt;math&gt;|N(H)|\ge |H|&lt;/math&gt;. Dabei ist &lt;math&gt;N(H)&lt;/math&gt; die [[Nachbarschaftsmenge]] von &lt;math&gt;H&lt;/math&gt;. (4)<br /> Aus (4) folgt schnell, dass sich unter den bipartiten Graphen genau alle regulären Graphen &lt;math&gt;1&lt;/math&gt;-faktorisieren lassen&lt;ref&gt;[[#Jungnickel|Jungnickel]] ''216.''&lt;/ref&gt; und die Aussage (1) von Petersen lässt elegant auf diese Folgerung zurückführen.&lt;ref name=&quot;Diestel-43&quot; /&gt; Eine Verallgemeinerung dieses Resultats liefert eine Formel für die Größe eines maximum Matchings, die sogenannte ''Kőnig-Ore'' Formel:&lt;ref&gt;[[#Yu &amp; Liu|Yu &amp; Liu]] ''9.''&lt;/ref&gt;&lt;ref&gt;[[#Bondy &amp; Murty|Bondy &amp; Murty]] ''422.''&lt;/ref&gt;<br /> :&lt;math&gt;\nu(G)= |S| - \max_{H\subseteq S}\{|H|-|N(H)|\}&lt;/math&gt;<br /> <br /> === Lösungsverfahren ===<br /> {| class=&quot;float-right&quot; style=&quot;width:30%&quot; |<br /> |+'''Algorithmus (I)'''&lt;br /&gt;<br /> |<br /> '''Eingabe''' &lt;math&gt;G&lt;/math&gt; mit einem beliebigen Matching &lt;math&gt;M&lt;/math&gt;<br /> 1. '''repeat'''<br /> 2. suche verbessernden Pfad &lt;math&gt;P&lt;/math&gt;<br /> 3. Falls gefunden: Augmentiere &lt;math&gt;M&lt;/math&gt; entlang &lt;math&gt;P&lt;/math&gt;.<br /> 4. '''until''' Suche nach verbesserndem Pfad war erfolglos<br /> '''Ausgabe''' &lt;math&gt;G&lt;/math&gt; mit maximum Matching &lt;math&gt;M&lt;/math&gt;<br /> |}<br /> Viele der folgenden Konzepte spielen in fast allen Lösungsverfahren von Matchingproblemen eine Rolle. Ist ein Graph &lt;math&gt;G&lt;/math&gt; mit einem Matching &lt;math&gt;M&lt;/math&gt; gegeben, dann heißt ein Knoten von &lt;math&gt;G&lt;/math&gt; ''frei'' (in der Literatur auch ''ungepaart, exponiert, verfügbar'' …) falls er zu keiner Kante in &lt;math&gt;M&lt;/math&gt; inzident ist. Andernfalls heißt der Knoten ''gesättigt.'' Ein Pfad &lt;math&gt;P&lt;/math&gt; in &lt;math&gt;G&lt;/math&gt; heißt ''alternierend,'' falls dieser abwechselnd Kanten aus &lt;math&gt;M&lt;/math&gt; und aus &lt;math&gt;M^c&lt;/math&gt; enthält. Falls dieser Pfad in einem freien Knoten beginnt und endet, heißt der Pfad ''verbessernd'' oder auch ''augmentierend.'' Die letzte Bezeichnung kommt von der Tatsache, dass &lt;math&gt;P&lt;/math&gt; durch &lt;math&gt;M\oplus P&lt;/math&gt;&lt;ref group=&quot;A&quot;&gt;&lt;math&gt;\oplus&lt;/math&gt; notiert die [[symmetrische Differenz]].&lt;/ref&gt; ein größeres Matching als &lt;math&gt;M&lt;/math&gt; liefert. Folgendes grundlegendes Resultat von [[Claude Berge|Berge]] 1957&lt;ref&gt;{{Cite journal<br /> | volume = 43<br /> | issue = 9<br /> | pages = 842–844<br /> | last = Berge<br /> | first = Claude<br /> | title = Two theorems in graph theory<br /> | journal = Proceedings of the National Academy of Sciences of the United States of America<br /> | date = 1957-09-15<br /> | url = http://www.pnas.org/content/43/9/842.full.pdf<br /> }}&lt;/ref&gt; motiviert das Studium von augmentierenden Pfaden.<br /> : Ein Matching ist genau dann Maximum, wenn es keinen verbessernden Pfad in &lt;math&gt;G&lt;/math&gt; bezüglich &lt;math&gt;M&lt;/math&gt; gibt.<br /> Diese Bezeichnungen entsprechen genau der Sprache, die auch bei der Behandlung von [[Flüsse und Schnitte in Netzwerken|Flüssen in Netzwerken]] gebraucht wird. Das ist kein Zufall, denn Matchingprobleme lassen sich in der Sprache der Netzwerktheorie formulieren und mit den dort entwickelten Verfahren lösen. Im bipartiten Fall ist diese Zurückführung, wie das folgende Beispiel zeigt, sogar fast trivial.<br /> Gegeben ein Graph &lt;math&gt;G&lt;/math&gt; mit Knotenmenge &lt;math&gt;V(G)=S\dot{\cup}T&lt;/math&gt;. Konstruiere ein [[Flüsse und Schnitte in Netzwerken#Netzwerk|Netzwerk]] &lt;math&gt;N=(G',u,\sigma,\tau)&lt;/math&gt;. Dabei ist &lt;math&gt;V(G')=V(G) \cup \{\sigma,\tau \}&lt;/math&gt; und &lt;math&gt;E(G')= E(G)\cup\{(\sigma,s) : s\in S\} \cup \{(t,\tau): t\in T\} &lt;/math&gt;. Außerdem ist &lt;math&gt;u&lt;/math&gt; die Fortsetzung von der Kostenfunktion &lt;math&gt;c&lt;/math&gt;, die alle neuen Kanten mit &lt;code&gt;Inf&lt;/code&gt;&lt;ref group=&quot;A&quot;&gt;Programmiersprachen, die das Konzept &lt;code&gt;Inf&lt;/code&gt; nicht unterstützen, können die künstlichen Kanten stattdessen mit einer absurd großen Zahl belegen. &lt;math&gt;\textstyle \sum_{e\in E(G)} c(e)&lt;/math&gt; genügt in jedem Fall.&lt;/ref&gt; belegt.<br /> <br /> Mit dem Satz von Berge lässt sich auch gleich ein Algorithmus (I) zum Finden von maximum Matchings angeben.&lt;ref&gt;Aus didaktischen Gründen sehr stark vereinfacht nach [[#Burkard, Dell’Amico &amp; Martello|Burkard, Dell’Amico &amp; Martello]] ''38.'' In der Referenz ist die Methode zum Finden eines verbessernden Pfades wesentlich detaillierter angegeben.&lt;/ref&gt; Weil jeder verbessernde Pfad zu einem gegebenen Matching einen weiteren Knoten matcht und maximal &lt;math&gt;\tfrac{n}{2}&lt;/math&gt; Knoten zu matchen sind, beschränkt sich die Zahl der Schleifendurchläufe [[Asymptotische Laufzeit|asymptotisch]] durch &lt;math&gt;\mathcal{O}(n)&lt;/math&gt;. Eine sehr naive Methode zum Finden verbessernder Pfade stellen sogenannte [[Suchverfahren in Graphen|Graph Scans]] dar, etwa eine Breitensuche (BFS) mit einer Laufzeit von &lt;math&gt;\mathcal{O}(n+m)&lt;/math&gt;. Ferner ist &lt;math&gt;m\in \mathcal{O}(n^2)&lt;/math&gt;, weil der Graph bipartit ist und damit ist die angegebene Methode in &lt;math&gt;\mathcal{O}(n^3)&lt;/math&gt;.<br /> <br /> Einer der frühesten Beiträge zum Berechnen von Maximum-Matchings, der über die oben angeführte naive Methode hinausgeht, war der [[Algorithmus von Hopcroft und Karp]] 1973.&lt;ref&gt;{{Cite journal<br /> | doi = 10.1137/0202019<br /> | issn = 0097-5397<br /> | volume = 2<br /> | issue = 4<br /> | pages = 225–231<br /> | last = Hopcroft<br /> | first = John E.<br /> | coauthors = Richard M. Karp<br /> | title = An &lt;math&gt;n^{5/2}&lt;/math&gt; Algorithm for Maximum Matchings in Bipartite Graphs<br /> | journal = SIAM Journal on Computing<br /> | date = 1973<br /> }}&lt;/ref&gt; Die Grundidee folgt dem [[Algorithmus von Dinic]] (mit dem das Problem mit derselben asymptotischen Laufzeit gelöst werden kann &lt;ref&gt;{{Cite journal<br /> | doi = 10.1137/0204043<br /> | issn = 0097-5397<br /> | volume = 4<br /> | issue = 4<br /> | pages = 507–518<br /> | last = Even<br /> | first = Shimon<br /> | coauthors = Robert E. Tarjan<br /> | title = Network flow and testing graph connectivity<br /> | journal = SIAM Journal on Computing<br /> | date = 1975<br /> }}&lt;/ref&gt;), der in jeder Phase, wo der Algorithmus nach einem verbessernden Pfad sucht (Zeile 2), möglichst kurze Pfade und nach Möglichkeit „mehrere gleichzeitig“ sucht.<br /> <br /> Alt, Blum, Mehlhorn &amp; Paul 1991&lt;ref&gt;{{Cite journal<br /> | doi = 10.1016/0020-0190(91)90195-N<br /> | issn = 0020-0190<br /> | volume = 37<br /> | issue = 4<br /> | pages = 237–240<br /> | last = Alt<br /> | first = H.<br /> | coauthors = N. Blum, K. Mehlhorn, M. Paul<br /> | title = Computing a maximum cardinality matching in a bipartite graph in time &lt;math&gt;\mathcal{O}(n^{1.5}\sqrt{m/\log n})&lt;/math&gt;<br /> | journal = Information Processing Letters<br /> | date = 1991<br /> }}&lt;/ref&gt; schlagen eine Verbesserung von Hopcroft &amp; Karp vor, indem sie ein Scanningverfahren für [[Adjazenzmatrizen]] nach Cheriyan, Hagerup, and Mehlhorn 1990&lt;ref&gt;{{Cite book<br /> | publisher = Springer-Verlag<br /> | isbn = 3-540-52826-1<br /> | volume = 443<br /> | pages = 235–248<br /> | last = Cheriyan<br /> | first = Joseph<br /> | coauthors = Torben Hagerup, Kurt Mehlhorn<br /> | title = Automata, Languages and Programming<br /> | chapter = Can a maximum flow be computed in &lt;math&gt;\mathcal{O}(nm)&lt;/math&gt; time?<br /> | location = Berlin/Heidelberg<br /> | date = 1990<br /> }}&lt;/ref&gt; anwenden. Eine einfache Beschreibung der Methode findet sich auch in [[#Burkard, Dell’Amico &amp; Martello|Burkard, Dell’Amico &amp; Martello]] ''47 ff.'' Feder und Motwani 1991&lt;ref&gt;{{Cite conference<br /> | publisher = ACM<br /> | doi = 10.1145/103418.103424<br /> | isbn = 0-89791-397-3<br /> | pages = 123–133<br /> | last = Feder<br /> | first = Tomás<br /> | coauthors = Rajeev Motwani<br /> | title = Clique partitions, graph compression and speeding-up algorithms<br /> | booktitle = Proceedings of the twenty-third annual ACM symposium on Theory of computing<br /> | location = New York<br /> | date = 1991<br /> }}&lt;/ref&gt; haben eine Methode vorgeschlagen, die auf der Zerlegung von &lt;math&gt;G&lt;/math&gt; in bipartite [[Clique (Graphentheorie)|Cliquen]] beruht und erreichen damit eine asymptotische Laufzeit von &lt;math&gt;\mathcal{O}( \sqrt{n} m \log(n^2 /m)/ \log n)&lt;/math&gt;. Eine Methode, die ''nicht'' auf der Idee augmentierender Pfade beruht, sondern sogenannte „starke [[Spannbaum|Spannbäume]]“ benutzt, haben Balinski &amp; Gonzalez 1991&lt;ref&gt;{{Cite journal<br /> | doi = 10.1002/net.3230210203<br /> | issn = 1097-0037<br /> | volume = 21<br /> | issue = 2<br /> | pages = 165–179<br /> | last = Balinski<br /> | first = M. L<br /> | coauthors = J. Gonzalez<br /> | title = Maximum matchings in bipartite graphs via strong spanning trees<br /> | journal = Networks<br /> | date = 1991<br /> }}&lt;/ref&gt; vorgeschlagen und erreichen damit eine Laufzeit von &lt;math&gt;\mathcal{O}(n^3)&lt;/math&gt;.<br /> <br /> == Allgemeiner Fall ==<br /> === Satz von Tutte ===<br /> {{Hauptartikel|Satz von Tutte}}<br /> <br /> Während Charakterisierungen von Matchings und effiziente Algorithmen zum Bestimmen relativ schnell nach der Formulierung von Matchings als Problem gefunden wurden, dauerte es bis 1947 bis Tutte&lt;ref name=&quot;tutte&quot;&gt;{{Cite journal<br /> | volume = 1<br /> | issue = 2<br /> | pages = 107<br /> | last = Tutte<br /> | first = W. T<br /> | title = The factorization of linear graphs<br /> | journal = Journal of the London Mathematical Society<br /> | date = 1947<br /> }}&lt;/ref&gt; eine Charakterisierung für perfekte Matchings in allgemeinen Graphen formulieren und beweisen konnte. Aus diesem tiefliegenden Resultat lassen sich alle bisher besprochenen vergleichsweise leicht herleiten.&lt;ref&gt;[[#Lovász &amp; Plummer|Lovász &amp; Plummer]] ''84.''&lt;/ref&gt; Tutte benutzt die einfache Tatsache, dass eine Komponente mit ungerader Knotenzahl in einem Graphen kein perfektes Matching haben kann. Wenn also eine Knotenmenge &lt;math&gt;S&lt;/math&gt; so gefunden werden kann, dass &lt;math&gt;G-S&lt;/math&gt; mehr ungerade Komponenten als &lt;math&gt;S&lt;/math&gt; Knoten hat, dann müsste für ein perfektes Matching aus jeder solcher Komponente wenigstens ein Knoten mit einem Knoten aus &lt;math&gt;S&lt;/math&gt; gematcht werden und das kann nicht sein. Es stellt sich heraus, dass die Existenz einer solchen Menge &lt;math&gt;S&lt;/math&gt; Graphen ohne perfektes Matching nicht nur beschreibt, sondern charakterisiert:<br /> <br /> : Ein Graph &lt;math&gt;G&lt;/math&gt; hat genau dann ein perfektes Matching, wenn für jede Menge &lt;math&gt;T\subseteq V(G)&lt;/math&gt; gilt: &lt;math&gt;c(G-T) \le | T |&lt;/math&gt;. (&lt;math&gt;c&lt;/math&gt; gibt die Anzahl der ungeraden Komponenten eines Graphen an.) (5)<br /> <br /> Eine solche Menge &lt;math&gt;T&lt;/math&gt; heißt ''Tutte-Menge'' und die Bedingung in (5) heißt ''Tutte-Bedingung.'' Dass sie [[Notwendige Bedingung|notwendig]] für die Existenz perfekter Matching ist, wurde schon skizziert und es gibt mittlerweile viele Beweise dafür, dass die Bedingung hinreichend ist: Tuttes ursprünglicher Beweis formulierte das Problem als ein Matrix-Problem und benutzte die Idee der [[Pfaffsche Determinante|pfaffschen Determinante]].&lt;ref name=&quot;tutte&quot; /&gt; [[Elementare Mathematik|Elementare]] Abzählargumente wurden relativ rasch danach veröffentlicht, wie in Maunsell 1952,&lt;ref&gt;{{Cite journal<br /> | volume = 1<br /> | issue = 1<br /> | pages = 127<br /> | last = Maunsell<br /> | first = F. G.<br /> | title = A note on Tutte’s paper “The factorization of linear graphs”<br /> | journal = Journal of the London Mathematical Society<br /> | date = 1952<br /> }}&lt;/ref&gt; Tutte 1952,&lt;ref&gt;{{Cite journal<br /> | pages = 164–178<br /> | first = W. T.<br /> | last = Tutte<br /> | title = The factors of graphs<br /> | journal = Classic Papers in Combinatorics<br /> | date = 1987<br /> }}&lt;/ref&gt; Gallai 1963,&lt;ref name=&quot;gallai&quot;&gt;{{Cite journal<br /> | volume = 8<br /> | pages = 135–139<br /> | last = Gallai<br /> | first = T.<br /> | title = Neuer Beweis eines Tutte’schen Satzes, Magyar Tud<br /> | journal = Akad. Kutató Int. Közl<br /> | date = 1963<br /> }}&lt;/ref&gt; Halton 1966&lt;ref&gt;{{Cite journal<br /> | doi = 10.1017/S0305004100040342<br /> | volume = 62<br /> | issue = 04<br /> | pages = 683–684<br /> | last = Halton<br /> | first = John H.<br /> | title = A Combinatorial Proof of a Theorem of Tutte<br /> | journal = Mathematical Proceedings of the Cambridge Philosophical Society<br /> | date = 1966<br /> }}&lt;/ref&gt; oder Balinski 1970.&lt;ref&gt;{{Cite journal<br /> | volume = 12<br /> | pages = 570–572<br /> | last = Balinski<br /> | first = M. L.<br /> | title = On perfect matchings<br /> | journal = SIAM Review<br /> | date = 1970<br /> }}&lt;/ref&gt; Andere Beweise, wie Gallai 1963,&lt;ref name=&quot;gallai&quot; /&gt; Anderson 1971&lt;ref&gt;{{Cite journal<br /> | volume = 10<br /> | issue = 3<br /> | pages = 183–186<br /> | last = Anderson<br /> | first = I.<br /> | title = Perfect matchings of a graph<br /> | journal = Journal of Combinatorial Theory, Series B<br /> | date = 1971<br /> }}&lt;/ref&gt; oder Marder 1973&lt;ref&gt;{{Cite journal<br /> | doi = 10.1007/BF01428195<br /> | issn = 0025-5831<br /> | volume = 201<br /> | issue = 4<br /> | pages = 269–282<br /> | last = Mader<br /> | first = W.<br /> | title = 1-Faktoren von Graphen<br /> | journal = Mathematische Annalen<br /> | date = 1973-12<br /> }}&lt;/ref&gt; verallgemeinern den Satz (4) von Hall systematisch. Ferner gibt es Beweise aus der Perspektive der Graphentheorie, die die Struktur von Graphen betrachten, die selbst kein Perfektes Matching besitzen, doch falls eine Kante ergänzt wird hat der resultierende Graph ein solches. Diesen Ansatz verfolgen etwa Hetyei 1972&lt;ref&gt;{{Cite journal<br /> | volume = 16<br /> | pages = 3–6<br /> | last = Hetyei<br /> | first = G.<br /> | title = A new proof of a factorization theorem<br /> | journal = Acta Acad. Paedagog. Civitate Pécs Ser. 6 Math. Phys. Chem. Tech<br /> | date = 1972<br /> }}&lt;/ref&gt; oder Lovász 1975.&lt;ref&gt;{{Cite journal<br /> | volume = 19<br /> | issue = 3<br /> | pages = 269–271<br /> | last = Lovasz<br /> | first = L.<br /> | title = Three short proofs in graph theory<br /> | journal = Journal of Combinatorial Theory, Series B<br /> | date = 1975<br /> }}&lt;/ref&gt;<br /> [[Datei:Blossom Counter.svg|mini|Es genügt nicht, ''erst'' alle Blüten zu suchen und zu kontrahieren und ''dann'' eine Breitensuche zu fahren. Die Priorität der Fallunterscheidungen spielt eine Rolle für die Korrektheit des Algorithmus.&lt;ref&gt;[[#Jungnickel|Jungnickel]] ''409.''&lt;/ref&gt; In diesem Beispiel enthält der kontrahierte Graph keinen augmentierenden Pfad, wohl aber der Ausgangsgraph.]]<br /> <br /> === Algorithmus von Edmonds ===<br /> Der erste [[Polynomialzeit]]algorithmus für das klassische Matchingproblem stammt von [[Jack Edmonds]] (1965).&lt;ref&gt;{{Cite journal<br /> | doi = 10.4153/CJM-1965-045-4<br /> | volume = 17<br /> | issue = 3<br /> | pages = 449–467<br /> | last = Edmonds<br /> | first = J.<br /> | title = Paths, trees, and flowers<br /> | journal = Canadian Journal of mathematics<br /> | date = 1965<br /> }}&lt;/ref&gt; Die Grundstruktur der Methode entspricht Algorithmus (I): Sie sucht verbessernde Pfade und gibt ein maximum Matching zurück, falls kein solcher gefunden werden kann. Einen verbessernden Pfad zu finden, stellt sich hier aber als schwieriger heraus als im bipartiten Fall, weil einige neue Fälle auftreten können. Edmonds Suchmethode konstruiert nach und nach einen ''alternierenden [[Wald (Graphentheorie)|Wald]].'' Das ist ein kreisfreier Graph &lt;math&gt;F&lt;/math&gt; mit so vielen Zusammenhangskomponenten wie es freie Knoten gibt. Jeder freie Knoten ist [[Wurzel (Graphentheorie)|Wurzel]] &lt;math&gt;r_i&lt;/math&gt; eines [[Baum (Graphentheorie)|Baumes]] &lt;math&gt;T\subset F&lt;/math&gt; und &lt;math&gt;F&lt;/math&gt; ist so konstruiert, dass für alle anderen Knoten &lt;math&gt;v\in F&lt;/math&gt; der eindeutig bestimmte &lt;math&gt;r_i&lt;/math&gt;-&lt;math&gt;v&lt;/math&gt;-Pfad ein alternierender Pfad ist. Ein Knoten in &lt;math&gt;v\in F&lt;/math&gt; heißt dann ''innen'' oder ''ungerade,'' falls &lt;math&gt;\operatorname{d}(r_i,v)\equiv 1\mod 2&lt;/math&gt; und andernfalls ''außen'' oder ''gerade.'' &lt;math&gt;\operatorname{d}&lt;/math&gt; sei hier die Distanzfunktion in &lt;math&gt;T&lt;/math&gt;, gebe also die Länge des eindeutig bestimmten &lt;math&gt;r_i&lt;/math&gt;-&lt;math&gt;v&lt;/math&gt;-Pfades an.<br /> <br /> Es genügt die Betrachtung auf die Konstruktion eines alternierenden Baumes zu reduzieren. Falls diese Konstruktion keinen augmentierenden Pfad findet, wird sie mit einem neuen freien Knoten reinitialisiert und alle bereits betrachteten Kanten werden ignoriert. Existiert kein freier Knoten mehr, dann existiert auch kein augmentierender Pfad. Diesen alternierenden Baum konstruiert Edmonds, indem er ausgehend von einem freien Knoten nach und nach alle Kanten hinzufügt oder ignoriert. Dabei können für eine neue Kante &lt;math&gt;e=uv&lt;/math&gt; (&lt;math&gt;u&lt;/math&gt; gehöre bereits zum Baum) folgende Fälle auftreten:<br /> <br /> # Wenn &lt;math&gt;u&lt;/math&gt; ein innerer Knoten ist, können nur Kanten &lt;math&gt;e\in M&lt;/math&gt; zu &lt;math&gt;T&lt;/math&gt; hinzugefügt werden, weil &lt;math&gt;T&lt;/math&gt; alternierend werden soll. Diese Kante ist eindeutig durch &lt;math&gt;(u~\operatorname{match}(u))&lt;/math&gt; gegeben.<br /> # Falls &lt;math&gt;u&lt;/math&gt; ein äußerer Knoten ist, dann kann &lt;math&gt;v&lt;/math&gt;&amp;nbsp;…<br /> ## frei sein und noch nicht in &lt;math&gt;T&lt;/math&gt;. Dann ist der &lt;math&gt;r&lt;/math&gt;-&lt;math&gt;v&lt;/math&gt;-Pfad augmentierend.<br /> ## gepaart sein und weder &lt;math&gt;v&lt;/math&gt; noch &lt;math&gt;\operatorname{match}(v)&lt;/math&gt; ist in &lt;math&gt;T&lt;/math&gt;. Dann können &lt;math&gt;v&lt;/math&gt; und &lt;math&gt;\operatorname{match}(v)&lt;/math&gt; zu &lt;math&gt;T&lt;/math&gt; hinzugefügt werden.<br /> ## bereits in &lt;math&gt;T&lt;/math&gt; als innerer Knoten enthalten sein. Damit schließt &lt;math&gt;e&lt;/math&gt; einen geraden Kreis. Diese Kanten können ignoriert werden.&lt;ref&gt;[[#Jungnickel|Jungnickel]] ''396.''&lt;/ref&gt;<br /> ## bereits in &lt;math&gt;T&lt;/math&gt; als ein äußerer Knoten enthalten sein. Dann schließt &lt;math&gt;e&lt;/math&gt; einen ungeraden alternierenden Kreis &lt;math&gt;B&lt;/math&gt;; eine sogenannte ''Blüte.'' Edmonds zieht die Knoten in &lt;math&gt;B&lt;/math&gt; zu einem Pseudoknoten &lt;math&gt;b&lt;/math&gt; zusammen mit den Inzidenzen aller Knoten aus &lt;math&gt;B&lt;/math&gt;. (Diese Operation lässt sich auch beschreiben als „Bildung des [[Quotientengraph]]en“ &lt;math&gt;G'=G/B&lt;/math&gt;) Er reinitialisiert dann die Suche in &lt;math&gt;G'&lt;/math&gt; und gibt ein Verfahren an, einen dort gefundenen augmentierenden Pfad &lt;math&gt;P'&lt;/math&gt; zu einem augmentierenden Pfad &lt;math&gt;P&lt;/math&gt; in &lt;math&gt;G&lt;/math&gt; zu liften.<br /> <br /> Blüten können, anders als bei Fall &lt;math&gt;3&lt;/math&gt;, nicht ignoriert werden.&lt;ref&gt;Betrachte [[:Datei:Blossoms can't be ignored.svg|dieses Beispiel]] nach [[#Jungnickel|Jungnickel]] ''398.''&lt;/ref&gt; Der Knoten, der die Blüte mit dem Baum verbindet, lässt sich in das Schema der inneren und äußeren Knoten nicht einordnen. Die naheliegende Idee, ihn als „sowohl innen als auch außen“ zu behandeln führt zu einem falschen Algorithmus.&lt;ref&gt;Diese Idee wurde in {{Cite book<br /> | isbn = 3-486-23911-2<br /> | pages = 103–114<br /> | last = Pape<br /> | first = U.<br /> | coauthors = D. Conradt<br /> | title = Ausgewählte Operations Research Software in FORTRAN<br /> | chapter = Maximales Matching in Graphen<br /> | location = Oldenbourg<br /> | date = 1979<br /> }} vorgeschlagen. [[#Jungnickel|Jungnickel]] ''399'' hat ein Gegenbeispiel, das auf Christian Fremuth-Paeger zurückgeht.&lt;/ref&gt; Die Behandlung von Blüten mit Kontraktion ist neben dem Ansatz von Berge ''die'' zentrale Idee von Edmonds’ Algorithmus und Grundlage vieler späterer Verfahren. Bipartite Graphen enthalten keine ungeraden Kreise und damit auch keine Blüten. Edmonds’ Algorithmus reduziert sich daher im bipartiten Fall auf die Methode von Munkres.<br /> <br /> Man kann ablesen, dass die skizzierte Methode von Edmonds einen Aufwand von &lt;math&gt;\mathcal{O}(n^4)&lt;/math&gt; hat. In Fall &lt;math&gt;2.4&lt;/math&gt; reinitialisiert Edmonds die Suche und verwirft damit den bereits geleisteten Suchaufwand. [[Harold N. Gabow|Gabow]] 1976&lt;ref&gt;{{Cite journal<br /> | doi = 10.1145/321941.321942<br /> | issn = 0004-5411<br /> | volume = 23<br /> | issue = 2<br /> | pages = 221–234<br /> | last = Gabow<br /> | first = Harold N.<br /> | title = An Efficient Implementation of Edmonds’ Algorithm for Maximum Matching on Graphs<br /> | journal = Journal of the ACM<br /> | date = 1976-04<br /> }}&lt;/ref&gt; und [[#Lawler|Lawler]] haben eine naive Implementierung vorgeschlagen, die den Suchaufwand nicht verwirft und eine Laufzeit von &lt;math&gt;\mathcal{O}(n^3)&lt;/math&gt; erreicht. Das Beispiel folgt bereits dieser Methode.<br /> <br /> &lt;gallery perrow=&quot;2&quot; caption=&quot;Beispiel zu Edmonds&quot; widths=&quot;300%&quot;&gt;<br /> Edmonds-example-0.svg&lt;math&gt;G&lt;/math&gt; bleibt unverändert.<br /> Edmonds-example-0.svg&lt;math&gt;G&lt;/math&gt; bleibt unverändert.<br /> Edmonds-example-t2.svg&lt;math&gt;5&lt;/math&gt; und&lt;math&gt;6&lt;/math&gt; sowie &lt;math&gt;4&lt;/math&gt; und &lt;math&gt;14&lt;/math&gt; werden wie eben nach Fall &lt;math&gt;2.2&lt;/math&gt; hinzugefügt. &lt;math&gt;(6~4)&lt;/math&gt; schließt einen geraden Kreis und wird nach &lt;math&gt;2.3&lt;/math&gt; ignoriert. Die Kante &lt;math&gt;(4~5)&lt;/math&gt; kann nach Fall &lt;math&gt;1.1&lt;/math&gt; ignoriert werden.<br /> Edmonds-example-0.svg&lt;math&gt;G&lt;/math&gt; bleibt unverändert.<br /> Edmonds-example-0.svg&lt;math&gt;G&lt;/math&gt; zieht eine Blüte zusammen.<br /> Edmonds-example-t4.svg&lt;math&gt;13~10&lt;/math&gt; wird nach Fall &lt;math&gt;1&lt;/math&gt; ignoriert und &lt;math&gt;12~10&lt;/math&gt; nach Fall &lt;math&gt;2.3&lt;/math&gt;. &lt;math&gt;12~11&lt;/math&gt; schließt eine Blüte &lt;math&gt;B&lt;/math&gt;.<br /> Edmonds-example-1.svg|Der reduzierte Graph &lt;math&gt;G'=G/B&lt;/math&gt;.<br /> Edmonds-example-t5.svg&lt;math&gt;b~7&lt;/math&gt; wird nach &lt;math&gt;2.3&lt;/math&gt; ignoriert.<br /> Edmonds-example-2.svg&lt;math&gt;G'&lt;/math&gt; mit einer weiteren Blüte &lt;math&gt;B'&lt;/math&gt;.<br /> Edmonds-example-t5.svg&lt;math&gt;b~8&lt;/math&gt; schließt wieder eine Blüte &lt;math&gt;B'&lt;/math&gt;. Blüten können auch Pseudoknoten enthalten.<br /> Edmonds-example-3.svg|Der weiter reduzierte Graph &lt;math&gt;G''=G'/B'&lt;/math&gt;<br /> Edmonds-example-t7.svg|Von &lt;math&gt;b'&lt;/math&gt; wird der freie Knoten &lt;math&gt;9&lt;/math&gt; gefunden, der nach Fall &lt;math&gt;2.1&lt;/math&gt; in &lt;math&gt;G''&lt;/math&gt; den augmentierenden Pfad &lt;math&gt;P''=(1~2~b'~9)&lt;/math&gt; schließt. Die Liftung dieses Pfades liefert &lt;math&gt;P=(1~2~3~5~6~7~8~9)&lt;/math&gt; zunächst in &lt;math&gt;G'&lt;/math&gt;, der aber auch schon in &lt;math&gt;G&lt;/math&gt; selbst liegt.<br /> &lt;/gallery&gt;<br /> <br /> == Literatur ==<br /> {{Anker|Lovász &amp; Plummer}}<br /> *{{Cite book<br /> | edition = 1<br /> | publisher = Elsevier Science und Akadémiai Kiadó Budapest<br /> | isbn = 0-444-87916-1<br /> | last = Lovász<br /> | first = L.<br /> | coauthors = M. D Plummer<br /> | title = Matching Theory<br /> | location = Budapest<br /> | series = Annals of Discrete Mathematics<br /> | date = 1986<br /> }}<br /> *{{Cite book<br /> | edition = 3., neu bearb. und erw. A.<br /> | publisher = Springer, Berlin<br /> | isbn = 3-540-21391-0<br /> | last = Diestel<br /> | first = Reinhard<br /> | title = Graphentheorie<br /> | date = 2006<br /> | url = http://diestel-graph-theory.com/german/index.html<br /> }}{{Anker|Jungnickel}}<br /> *{{Cite book<br /> | edition = 3<br /> | publisher = Springer<br /> | isbn = 978-3-540-72779-8<br /> | volume = 5<br /> | last = Jungnickel<br /> | first = Dieter<br /> | title = Graphs, Networks and Algorithms<br /> | series = Algorithms and Computation in Mathematics<br /> | date = 2007<br /> }}{{Anker|Yu &amp; Liu}}<br /> *{{Cite book<br /> | edition = 1<br /> | publisher = Springer<br /> | isbn = 3-540-93951-2<br /> | last = Yu<br /> | first = Qinglin Roger<br /> | coauthors = Guizhen Liu<br /> | title = Graph Factors and Matching Extensions<br /> | location = Beijing<br /> | date = 2009<br /> }}{{Anker|Schrijver}}<br /> *{{Cite book<br /> | publisher = Springer<br /> | isbn = 3-540-44389-4<br /> | volume = A<br /> | last = Schrijver<br /> | first = Alexander<br /> | title = Combinatorial Optimization – Polyhedra and Efficiency<br /> | location = Amsterdam<br /> | series = Algorithms and Combinatorics<br /> | date = 2003<br /> }}{{Anker|Bondy &amp; Murty}}<br /> *{{Cite book<br /> | publisher = Springer<br /> | isbn = 1-84996-690-7<br /> | last = Bondy<br /> | first = Adrian<br /> | coauthors = U.S.R. Murty<br /> | title = Graph Theory<br /> | series = Graduate Texts in Mathematics<br /> | date = 2008<br /> | url = http://blogs.springer.com/bondyandmurty/<br /> }}{{Anker|Burkard, Dell’Amico &amp; Martello}}<br /> *{{Cite book<br /> | publisher = Society for Industrial and Applied Mathematics<br /> | isbn = 978-1-61197-222-1<br /> | last = Burkard<br /> | first = Rainer<br /> | coauthors = Mauro Dell’Amico, Silvano Martello<br /> | title = Assignment Problems (Revised reprint)<br /> | location = Philadelphia<br /> | date = 2012<br /> | url = http://www.assignmentproblems.com/<br /> }}{{Anker|Johnson}}<br /> *{{Cite book<br /> | publisher = American Mathematical Society<br /> | isbn = 0-8218-6598-6<br /> | last = Johnson<br /> | first = David S.<br /> | title = Network Flows and Matching: First Dimacs Implementation Challenge<br /> | date = 1993<br /> }}{{Anker|Lawler}}<br /> *{{Cite book<br /> | publisher = Dover Publications<br /> | isbn = 0-03-084866-0<br /> | last = Lawler<br /> | first = Eugene<br /> | title = Combinatorial Optimization: Networks and Matroids<br /> | location = Rocquencourt<br /> | date = 1976<br /> }}<br /> ; Historisch:{{Anker|Kőnig}}<br /> *{{Cite book<br /> | edition = 1. Auflage 1986<br /> | publisher = Teubner Verlagsgesellschaft<br /> | isbn = 3-322-00303-5<br /> | last = Kőnig<br /> | first = Dénes<br /> | title = Theorie der endlichen und unendlichen Graphen – kombinatorische Topologie der Streckenkomplexe.<br /> | location = Leipzig<br /> | series = Teubner Archiv zur Mathematik<br /> | date = 1936<br /> }}{{Anker|Biggs, Lloyd &amp; Wilson}}<br /> *{{Cite book<br /> | publisher = Oxford University Press, USA<br /> | isbn = 0-19-853916-9<br /> | last = Biggs<br /> | first = Norman L.<br /> | coauthors = E. Keith Lloyd, Robin J. Wilson<br /> | title = Graph Theory 1736–1936<br /> | date = 1999<br /> }}<br /> <br /> == Weblinks ==<br /> {{Commonscat|Matching (graph theory)|Matching}}<br /> <br /> == Einzelnachweise ==<br /> &lt;references /&gt;<br /> <br /> == Anmerkungen ==<br /> &lt;references group=&quot;A&quot; /&gt;<br /> <br /> {{Normdaten|TYP=s|GND=4831446-8}}<br /> <br /> [[Kategorie:Grundbegriff (Graphentheorie)]]</div> Flowi https://de.wikipedia.org/w/index.php?title=Matching_(Graphentheorie)&diff=161788200 Matching (Graphentheorie) 2017-01-19T13:18:28Z <p>Flowi: Bei der Laufzeit von Alt et al. (im Quellenverzeichnis) war der Faktor sqrt(m / log(n)) fälschlicherweise im Exponenten (Quelle: ibid)</p> <hr /> <div>{{Weiterleitungshinweis|Perfekte Paarung|für den Begriff der nicht-ausgearteten Bilinearform aus der linearen Algebra siehe [[ausgeartete Bilinearform]].}}<br /> Die Theorie um das Finden von '''Matchings''' in Graphen ist in der [[Diskrete Mathematik|diskreten Mathematik]] ein umfangreiches Teilgebiet, das in die [[Graphentheorie]] eingeordnet wird.<br /> <br /> Folgende Situation wird dabei betrachtet: Gegeben eine Menge von Dingen und zu diesen Dingen Informationen darüber, welche davon einander zugeordnet werden könnten. Ein Matching (in der Literatur manchmal auch '''Paarung''') ist dann als eine solche Auswahl aus den möglichen Zuordnungen definiert, die kein Ding mehr als einmal zuordnet.<br /> <br /> Die am häufigsten gestellten Fragen in dieser Situation sind dann die folgenden:<br /> # Wie findet man ein Matching, das eine maximale Anzahl&lt;ref group=&quot;A&quot;&gt;Beachte den Unterschied zwischen einem [[Maximales Element|maximalen Element]] und einem [[größtes Element|Maximum]]. Bei der [[#Formalisierung|Formalisierung]] wird darauf genauer eingegangen.&lt;/ref&gt; an Dingen einander zuordnet?&lt;br /&gt;Dieses Problem ist das ''klassische Matchingproblem.''<br /> # Gibt es ein Matching, das alle Dinge zuordnet? Wenn ja, wie viele?&lt;br /&gt;Solche Matchings heißen ''perfektes Matching.'' Die Anzahl der perfekten Matchings in einem Graphen &lt;math&gt;G&lt;/math&gt; wird meistens mit &lt;math&gt;\Phi(G)&lt;/math&gt; notiert.<br /> # Angenommen, man könnte quantifizieren „wie wichtig“ (oder „teuer“) die einzelnen Zuordnungen wären: Wie findet man dann ein Matching, das eine maximale Zahl von Dingen zuordnet und dabei ein möglichst großes (oder kleines) Gewicht hat?&lt;br /&gt;Dieses Problem heißt ''gewichtetes Matchingproblem.'' Zwischen einer Maximierungs- und einer Minimierungsaufgabe wird hier oftmals nicht unterschieden: Indem man bei allen Gewichten (Kosten) das [[Vorzeichen (Zahl)|Vorzeichen]] vertauscht, kann man beide Probleme ohne nennenswerten Aufwand ineinander überführen.<br /> # Angenommen, man hätte genau zwei Klassen von Dingen und angenommen, man wüsste, dass es ausschließlich zwischen diesen Klassen mögliche Zuordnungen gibt. Werden die Probleme 1–3 dadurch einfacher?&lt;br /&gt;Dieses Problem heißt ''[[Bipartiter Graph|bipartites]] (gewichtetes) Matchingproblem'' und ist ein viel diskutierter Spezialfall.<br /> # Kann man anderes Wissen, das man über die Struktur der möglichen Zuordnungen hat, ähnlich wie in 4 geschickt benutzen, um die Probleme 1–3 effizienter zu lösen?<br /> <br /> Die Theorie um die Matchings untersucht möglichst effiziente Lösungsverfahren dieser Probleme, klassifiziert diese nach ihrer „Schwierigkeit“ mit den Methoden der [[Komplexitätstheorie]] und stellt Beziehungen dieser Probleme zueinander und zu anderen Problemen in der Mathematik her.<br /> <br /> == Definitionen ==<br /> &lt;gallery class=&quot;float-right&quot;&gt;<br /> maximal-simple.svg|Ein einfacher Graph mit einem nicht erweiterbaren Matching (maximal matching)<br /> perfect-simple.svg|Derselbe Graph mit einem perfekten (wie auch größtmöglichen) Matching<br /> &lt;/gallery&gt;<br /> Das oben beschriebene Problem lässt sich wie folgt formalisieren. Gegeben sei ein endlicher, ungerichteter Graph &lt;math&gt;G=(V,E)&lt;/math&gt;. Eine Menge &lt;math&gt;M\subseteq E&lt;/math&gt; heißt (gültiges) Matching wenn keine zwei Kanten aus &lt;math&gt;M&lt;/math&gt; einen Knoten gemeinsam haben. Ein Matching heißt<br /> ; nicht erweiterbar (engl. maximal matching): falls es keine Kante &lt;math&gt;e\in E\setminus M&lt;/math&gt; derart gibt, dass &lt;math&gt;\{e\}\cup M&lt;/math&gt; ein gültiges Matching ist. Maximale Matchings sind im Vergleich zu den folgenden Begriffen sehr einfach zu berechnen.<br /> ; größtmöglich (engl. maximum matching): falls &lt;math&gt;M&lt;/math&gt; als Menge eine maximale Kardinalität unter allen gültigen Matchings von &lt;math&gt;G&lt;/math&gt; hat. Maximum-Matchings sind maximal. Die Mächtigkeit eines Maximum-Matchings wird ''Matchingzahl'' genannt und mit &lt;math&gt;\nu(G)&lt;/math&gt; notiert.<br /> ; perfekt: falls &lt;math&gt;2 \cdot | M | = | V |&lt;/math&gt; gilt. Perfekte Matchings sind Maximum-Matchings (und damit auch maximal). Perfekte Matchings können als ''[[Graph Faktor|1-Faktoren]]'' eines Graphen, das heißt [[Regulärer Graph|1-reguläre]] aufspannende Teilgraphen, aufgefasst werden. Dieser Auffassung folgend spricht man auch von ''faktorisierbaren Graphen,'' wenn sie einen 1-Faktor besitzen. Beide Sprechweisen sind etwa gleich weit verbreitet.&lt;ref&gt;[[#Yu &amp; Liu|Yu &amp; Liu]] ''4.''&lt;/ref&gt;<br /> <br /> Für das gewichtete Matchingproblem spielt eine Kostenfunktion &lt;math&gt;c: E\to \mathbb{R}&lt;/math&gt; eine Rolle. Ein gültiges Matching heißt dann …<br /> ; von maximalem Gewicht: falls &lt;math&gt;c(M) := \sum_{e\in M} c(e)&lt;/math&gt; maximal unter allen gültigen Matchings von &lt;math&gt;G&lt;/math&gt; ist.<br /> ; minimal maximal: falls &lt;math&gt;c(M)&lt;/math&gt; minimal unter allen maximalen Matchings ist.<br /> <br /> == Historisches ==<br /> [[Datei:Sylvester counter.svg|mini|[[James Joseph Sylvester|Sylvester]] gab für Aussage (2) ein Beispiel an, das zeigt, dass sie für Graphen mit drei oder mehr Brücken nicht mehr stimmt: ein 3-regulärer Graph mit 16 Knoten, drei Brücken und keinem perfekten Matching.]]<br /> Als eine der frühesten&lt;ref name=&quot;ReferenceA&quot;&gt;[[#Lovász &amp; Plummer|Lovász &amp; Plummer]] ''xi.''&lt;/ref&gt;&lt;ref&gt;[[#Yu &amp; Liu|Yu &amp; Liu]] ''3.''&lt;/ref&gt; systematischen Untersuchungen von Matchings wird ein Artikel von [[Julius Peter Christian Petersen|Julius Petersen]] angeführt, der 1891 über „Die Theorie der regulären graphs“ schrieb.&lt;ref&gt;{{Cite journal<br /> | volume = 15<br /> | pages = 193–220<br /> | last = Petersen<br /> | first = Julius<br /> | title = Die Theorie der regulären graphs<br /> | journal = [[Acta Mathematica]]<br /> | date = 1891<br /> | doi = 10.1007/BF02392606<br /> }}&lt;/ref&gt; Er untersuchte ein Zerlegungsproblem aus der Algebra, das [[David Hilbert]] 1889&lt;ref&gt;{{Cite journal<br /> | volume = 33<br /> | issue = 2<br /> | pages = 223–226<br /> | last = Hilbert<br /> | first = David<br /> | authorlink = David Hilbert<br /> | title = Über die Endlichkeit des Invariantensystems für binäre Grundformen<br /> | journal = Mathematische Annalen<br /> | date = 1889<br /> }}&lt;/ref&gt; gestellt hatte, indem er es als Graphenproblem formulierte.&lt;ref name=&quot;ReferenceA&quot; /&gt; Letztlich bewies er darin folgendes:<br /> : Für alle Zahlen &lt;math&gt;k\in \mathbb{N}&lt;/math&gt; kann jeder &lt;math&gt;2k&lt;/math&gt;-reguläre Graph in disjunkte &lt;math&gt;2&lt;/math&gt;-Faktoren zerlegt werden. (1)<br /> : Jeder [[Kubischer Graph|kubische]], zusammenhängende Graph mit weniger als drei Brücken besitzt ein perfektes Matching. (2)<br /> Die Tatsache (2), bekannt als [[Satz von Petersen]], lässt sich auch als eine leichte Verallgemeinerung des [[Eulerkreisproblem]]s formulieren.&lt;ref group=&quot;A&quot;&gt;Es ist nicht bekannt, ob Petersen mit den Arbeiten von [[Leonhard Euler|Euler]] 1736 zu diesem Problem vertraut war ([[#Lovász &amp; Plummer|Lovász &amp; Plummer]] ''xi'').&lt;/ref&gt;<br /> <br /> Rückblickend erscheinen Petersens Argumente, mit denen er das Obige bewies, kompliziert und umständlich.&lt;ref name=&quot;Diestel-43&quot;&gt;{{Cite book<br /> | edition = 3., neu bearb. und erw. A.<br /> | publisher = Springer, Berlin<br /> | isbn = 3-540-21391-0<br /> | last = Diestel<br /> | first = Reinhard<br /> | title = Graphentheorie<br /> | date = 2006<br /> | pages = 43<br /> | url = http://diestel-graph-theory.com/german/index.html<br /> }}<br /> &lt;/ref&gt; Bei der weiteren Untersuchung etwa durch [[Henry Roy Brahana|Brahana]] 1917&lt;ref&gt;{{Cite journal<br /> | doi = 10.2307/1967667<br /> | issn = 0003-486X<br /> | volume = 19<br /> | issue = 1<br /> | pages = 59–63<br /> | last = Brahana<br /> | first = Henry Roy<br /> | title = A Proof of Petersen’s Theorem<br /> | journal = The Annals of Mathematics<br /> | date = 1917<br /> }}&lt;/ref&gt;, [[Alfred Errera|Errera]] 1922&lt;ref&gt;{{Cite journal<br /> | volume = 36<br /> | pages = 56–61<br /> | last = Errera<br /> | first = Alfred<br /> | title = Une demonstration du théorème de Petersen<br /> | journal = Mathesis<br /> | date = 1922<br /> }}&lt;/ref&gt; und [[Orrin Frink|Frink]] 1926&lt;ref&gt;{{Cite journal<br /> | doi = 10.2307/1967699<br /> | issn = 0003-486X<br /> | volume = 27<br /> | issue = 4<br /> | pages = 491–493<br /> | last = Frink<br /> | first = Orrin<br /> | title = A Proof of Petersen’s Theorem<br /> | journal = The Annals of Mathematics<br /> | date = 1926<br /> }}&lt;/ref&gt; sowie zusammenfassend durch [[Dénes Kőnig|Kőnig]] 1936&lt;ref&gt;{{Cite book<br /> | last = Kőnig<br /> | first = Dénes<br /> | title = Theorie der endlichen und unendlichen Graphen; kombinatorische Topologie der Streckenkomplexe.<br /> | date = 1936<br /> }}&lt;/ref&gt; wurden aber viele Methoden der modernen Graphentheorie entwickelt oder zuerst systematisch formuliert. Petersens Denkansatz wurde dann von [[Fridolin Bäbler|Bäbler]] 1938&lt;ref&gt;{{Cite journal<br /> | doi = 10.1007/BF01214296<br /> | issn = 0010-2571<br /> | volume = 10<br /> | issue = 1<br /> | pages = 275–287<br /> | last = Bäbler<br /> | first = Fridolin<br /> | title = Über die Zerlegung regulärer Streckenkomplexe ungerader Ordnung<br /> | journal = Commentarii Mathematici Helvetici<br /> | date = 1938<br /> }}&lt;/ref&gt; 1952&lt;ref&gt;{{Cite journal<br /> | issn = 0010-2571<br /> | volume = 26<br /> | pages = 117–118<br /> | last = Bäbler<br /> | first = Fridolin<br /> | title = Bemerkungen zu einer Arbeit von Herrn R. Cantoni.<br /> | journal = Commentarii Mathematici Helvetici<br /> | date = 1952<br /> | url = http://www.digizeitschriften.de/dms/img/?PPN=GDZPPN002055910<br /> }}&lt;/ref&gt; und 1954&lt;ref&gt;{{Cite journal<br /> | doi = 10.1007/BF02566927<br /> | issn = 0010-2571<br /> | volume = 28<br /> | issue = 1<br /> | pages = 155–161<br /> | last = Bäbler<br /> | first = Fridolin<br /> | title = Über den Zerlegungssatz von Petersen<br /> | journal = Commentarii Mathematici Helvetici<br /> | date = 1954<br /> }}&lt;/ref&gt; sowie von [[Tibor Gallai|Gallai]] 1950&lt;ref&gt;{{Cite journal<br /> | issn = 0236-5294<br /> | volume = 1<br /> | pages = 133–153<br /> | last = Gallai<br /> | first = Tibor<br /> | title = On factorization of graphs<br /> | journal = Acta Mathematica Academiae Scientiarum Hungaricae<br /> | date = 1950<br /> }}&lt;/ref&gt;, [[Hans-Boris Belck|Belck]] 1950&lt;ref&gt;{{Cite journal<br /> | doi = 10.1515/crll.1950.188.228<br /> | issn = 0075-4102<br /> | volume = 1950<br /> | issue = 188<br /> | pages = 228–252<br /> | last = Belck<br /> | first = Hans-Boris<br /> | title = Reguläre Faktoren von Graphen.<br /> | journal = Journal für die reine und angewandte Mathematik (Crelles Journal)<br /> | date = 1950<br /> }}&lt;/ref&gt; und schließlich Tutte auf andere reguläre Graphen übertragen.<br /> <br /> In modernen Lehrbüchern und Vorlesungen tauchen Petersens ursprüngliche Resultate, wenn überhaupt, meist nur noch als Folgerungen aus den Resultaten von Tutte oder Hall auf. Im Buch von Diestel folgt die erste Aussage aus dem [[Heiratssatz]] von Hall.&lt;ref name=&quot;Diestel-43&quot; /&gt; Die zweite Aussage wird auf den Satz von Tutte zurückgeführt.&lt;ref&gt;{{Cite book<br /> | edition = 3., neu bearb. und erw. A.<br /> | publisher = Springer, Berlin<br /> | isbn = 3-540-21391-0<br /> | last = Diestel<br /> | first = Reinhard<br /> | title = Graphentheorie<br /> | date = 2006<br /> | pages = 45<br /> | url = http://diestel-graph-theory.com/german/index.html<br /> }}&lt;/ref&gt;<br /> <br /> == Bipartite Matchings ==<br /> Eines dieser frühen Resultate betrifft [[Bipartiter Graph|bipartite Graphen]], die sich in der Folge als ein sehr natürlicher und aus heutiger Sicht für die Praxis zentraler Spezialfall herausgestellt haben. Kőnig und Egerváry untersuchten beide unabhängig voneinander das bipartite Matchingproblem und das [[Knotenüberdeckungsproblem]] und fanden dabei heraus, dass beide Probleme in dem folgenden Sinn äquivalent sind:<br /> : Die Größe einer minimalen Knotenüberdeckung und eines maximum Matching stimmen auf bipartiten Graphen überein. (3)<br /> Dieser Satz wird meistens Kőnig zugeschrieben oder ''Min-Max-Theorem'' bzw. ''Dualitätssatz'' genannt. Beide bewiesen die Aussage für endliche Graphen. [[Ron Aharoni|Aharoni]] bewies 1984 die Aussage für [[überabzählbar]] unendliche Graphen.&lt;ref&gt;{{Cite journal<br /> | doi = 10.1112/jlms/s2-29.1.1<br /> | issn = 0024-6107<br /> | volume = s2-29<br /> | issue = 1<br /> | pages = 1–12<br /> | last = Aharoni<br /> | first = Ron<br /> | title = Kőnig’s Duality Theorem for Infinite Bipartite Graphs<br /> | journal = Journal of the London Mathematical Society<br /> | date = 1984<br /> }}&lt;/ref&gt; Ein elementarer Beweis von (3) findet sich in [[#Lovász &amp; Plummer|Lovász &amp; Plummer]] ''43,'' der von den meisten Lehrbüchern übernommen wurde. [[#Bondy &amp; Murty|Bondy &amp; Murty]] ''200'' führt den Satz auf ein Resultat der [[Lineares Programm|linearen Programmierung]] zurück: Ist &lt;math&gt;A&lt;/math&gt; die [[Inzidenzmatrix]] des Graphen &lt;math&gt;G&lt;/math&gt;, dann lassen sich maximum Matchings als Lösungen von folgendem ganzzahligen linearen Programm auffassen:<br /> :&lt;math&gt;\max ex \text{ unter } Ax\le 1 \land x\ge 0&lt;/math&gt;<br /> Dabei ist &lt;math&gt;e&lt;/math&gt; der [[Einsvektor]] bestehend aus lauter Einsen. Das Programm des Knotenüberdeckungsproblems hat folgende Gestalt:<br /> :&lt;math&gt;\min ye \text{ unter } yA\ge 1 \land y\ge 0&lt;/math&gt;<br /> Diese Programme haben eine sogenannte ''primal-dual''-Gestalt. Für Programme von dieser Gestalt wird in der Theorie der linearen Programme gezeigt, dass sie in ihren Optima übereinstimmen. Für bipartite Graphen lässt sich außerdem leicht zeigen, dass &lt;math&gt;A&lt;/math&gt; [[Total unimodulare Matrix|total unimodular]] ist, was in der Theorie der ganzzahligen linearen Programme ein Kriterium für die Existenz einer optimalen Lösung der Programme mit Einträgen nur aus &lt;math&gt;\mathbb{Z}&lt;/math&gt; (und damit in diesem speziellen Fall sogar aus &lt;math&gt;\left\{0, 1\right\}&lt;/math&gt;) ist, also genau solchen Vektoren, die auch für ein Matching bzw. für eine Knotenüberdeckung stehen können. Dieser Primal-Dual-Ansatz der linearen Programme scheint zunächst wenig mit der Matching-Theorie zu tun zu haben, stellt sich aber als einer der fruchtbarsten Ansätze zur effizienten Berechnung von Matchings, insbesondere im gewichteten Fall, heraus.<br /> <br /> Es gibt eine ganze Vielzahl von Sätzen, die zum Satz von Kőnig äquivalent sind.&lt;ref&gt;[[#Lovász &amp; Plummer|Lovász &amp; Plummer]] ''5-40.''&lt;/ref&gt;&lt;ref&gt;Notizen zu einem Vortrag von Robert D. Borgersen: ''[http://www.robertborgersen.info/Presentations/GS-05R-1.pdf Equivalence of seven major theorems in combinatorics.]'' (PDF; 66&amp;nbsp;kB). November 26, 2004.&lt;/ref&gt;&lt;ref&gt;{{Cite journal<br /> | pages = 103–141<br /> | last = Jacobs<br /> | first = K.<br /> | title = Der Heiratssatz<br /> | journal = Selecta Mathematica I<br /> | date = 1969<br /> }}&lt;/ref&gt; Darunter der [[Satz von Birkhoff und von Neumann]], der [[Satz von Dilworth]] und das [[Max-Flow-Min-Cut-Theorem]] für bipartite Graphen. Für die Matchingtheorie am interessantesten ist folgende Bedingung, die [[Philip Hall|Hall]] 1935&lt;ref&gt;{{Cite journal<br /> | volume = 10<br /> | pages = 26–30<br /> | last = Hall<br /> | first = Philip<br /> | title = On representatives of subsets<br /> | journal = Journal of London Mathematics Society<br /> | date = 1935<br /> }}&lt;/ref&gt; angab, um bipartite Graphen mit perfektem Matching zu charakterisieren. Dieser Charakterisierungssatz ist ebenfalls äquivalent zum Satz von Kőnig.<br /> : Ein bipartiter Graph mit Knotenpartitionen &lt;math&gt;S\dot{\cup} T&lt;/math&gt; und [[Ohne Beschränkung der Allgemeinheit|o.B.d.A]] &lt;math&gt;|S|\ge |T|&lt;/math&gt; hat [[Bikonditional|genau dann]] ein perfektes Matching, wenn für jede Auswahl von Knoten &lt;math&gt;H\subseteq S&lt;/math&gt; gilt: &lt;math&gt;|N(H)|\ge |H|&lt;/math&gt;. Dabei ist &lt;math&gt;N(H)&lt;/math&gt; die [[Nachbarschaftsmenge]] von &lt;math&gt;H&lt;/math&gt;. (4)<br /> Aus (4) folgt schnell, dass sich unter den bipartiten Graphen genau alle regulären Graphen &lt;math&gt;1&lt;/math&gt;-faktorisieren lassen&lt;ref&gt;[[#Jungnickel|Jungnickel]] ''216.''&lt;/ref&gt; und die Aussage (1) von Petersen lässt elegant auf diese Folgerung zurückführen.&lt;ref name=&quot;Diestel-43&quot; /&gt; Eine Verallgemeinerung dieses Resultats liefert eine Formel für die Größe eines maximum Matchings, die sogenannte ''Kőnig-Ore'' Formel:&lt;ref&gt;[[#Yu &amp; Liu|Yu &amp; Liu]] ''9.''&lt;/ref&gt;&lt;ref&gt;[[#Bondy &amp; Murty|Bondy &amp; Murty]] ''422.''&lt;/ref&gt;<br /> :&lt;math&gt;\nu(G)= |S| - \max_{H\subseteq S}\{|H|-|N(H)|\}&lt;/math&gt;<br /> <br /> === Lösungsverfahren ===<br /> {| class=&quot;float-right&quot; style=&quot;width:30%&quot; |<br /> |+'''Algorithmus (I)'''&lt;br /&gt;<br /> |<br /> '''Eingabe''' &lt;math&gt;G&lt;/math&gt; mit einem beliebigen Matching &lt;math&gt;M&lt;/math&gt;<br /> 1. '''repeat'''<br /> 2. suche verbessernden Pfad &lt;math&gt;P&lt;/math&gt;<br /> 3. Falls gefunden: Augmentiere &lt;math&gt;M&lt;/math&gt; entlang &lt;math&gt;P&lt;/math&gt;.<br /> 4. '''until''' Suche nach verbesserndem Pfad war erfolglos<br /> '''Ausgabe''' &lt;math&gt;G&lt;/math&gt; mit maximum Matching &lt;math&gt;M&lt;/math&gt;<br /> |}<br /> Viele der folgenden Konzepte spielen in fast allen Lösungsverfahren von Matchingproblemen eine Rolle. Ist ein Graph &lt;math&gt;G&lt;/math&gt; mit einem Matching &lt;math&gt;M&lt;/math&gt; gegeben, dann heißt ein Knoten von &lt;math&gt;G&lt;/math&gt; ''frei'' (in der Literatur auch ''ungepaart, exponiert, verfügbar'' …) falls er zu keiner Kante in &lt;math&gt;M&lt;/math&gt; inzident ist. Andernfalls heißt der Knoten ''gesättigt.'' Ein Pfad &lt;math&gt;P&lt;/math&gt; in &lt;math&gt;G&lt;/math&gt; heißt ''alternierend,'' falls dieser abwechselnd Kanten aus &lt;math&gt;M&lt;/math&gt; und aus &lt;math&gt;M^c&lt;/math&gt; enthält. Falls dieser Pfad in einem freien Knoten beginnt und endet, heißt der Pfad ''verbessernd'' oder auch ''augmentierend.'' Die letzte Bezeichnung kommt von der Tatsache, dass &lt;math&gt;P&lt;/math&gt; durch &lt;math&gt;M\oplus P&lt;/math&gt;&lt;ref group=&quot;A&quot;&gt;&lt;math&gt;\oplus&lt;/math&gt; notiert die [[symmetrische Differenz]].&lt;/ref&gt; ein größeres Matching als &lt;math&gt;M&lt;/math&gt; liefert. Folgendes grundlegendes Resultat von [[Claude Berge|Berge]] 1957&lt;ref&gt;{{Cite journal<br /> | volume = 43<br /> | issue = 9<br /> | pages = 842–844<br /> | last = Berge<br /> | first = Claude<br /> | title = Two theorems in graph theory<br /> | journal = Proceedings of the National Academy of Sciences of the United States of America<br /> | date = 1957-09-15<br /> | url = http://www.pnas.org/content/43/9/842.full.pdf<br /> }}&lt;/ref&gt; motiviert das Studium von augmentierenden Pfaden.<br /> : Ein Matching ist genau dann Maximum, wenn es keinen verbessernden Pfad in &lt;math&gt;G&lt;/math&gt; bezüglich &lt;math&gt;M&lt;/math&gt; gibt.<br /> Diese Bezeichnungen entsprechen genau der Sprache, die auch bei der Behandlung von [[Flüsse und Schnitte in Netzwerken|Flüssen in Netzwerken]] gebraucht wird. Das ist kein Zufall, denn Matchingprobleme lassen sich in der Sprache der Netzwerktheorie formulieren und mit den dort entwickelten Verfahren lösen. Im bipartiten Fall ist diese Zurückführung, wie das folgende Beispiel zeigt, sogar fast trivial.<br /> Gegeben ein Graph &lt;math&gt;G&lt;/math&gt; mit Knotenmenge &lt;math&gt;V(G)=S\dot{\cup}T&lt;/math&gt;. Konstruiere ein [[Flüsse und Schnitte in Netzwerken#Netzwerk|Netzwerk]] &lt;math&gt;N=(G',u,\sigma,\tau)&lt;/math&gt;. Dabei ist &lt;math&gt;V(G')=V(G) \cup \{\sigma,\tau \}&lt;/math&gt; und &lt;math&gt;E(G')= E(G)\cup\{(\sigma,s) : s\in S\} \cup \{(t,\tau): t\in T\} &lt;/math&gt;. Außerdem ist &lt;math&gt;u&lt;/math&gt; die Fortsetzung von der Kostenfunktion &lt;math&gt;c&lt;/math&gt;, die alle neuen Kanten mit &lt;code&gt;Inf&lt;/code&gt;&lt;ref group=&quot;A&quot;&gt;Programmiersprachen, die das Konzept &lt;code&gt;Inf&lt;/code&gt; nicht unterstützen, können die künstlichen Kanten stattdessen mit einer absurd großen Zahl belegen. &lt;math&gt;\textstyle \sum_{e\in E(G)} c(e)&lt;/math&gt; genügt in jedem Fall.&lt;/ref&gt; belegt.<br /> <br /> Mit dem Satz von Berge lässt sich auch gleich ein Algorithmus (I) zum Finden von maximum Matchings angeben.&lt;ref&gt;Aus didaktischen Gründen sehr stark vereinfacht nach [[#Burkard, Dell’Amico &amp; Martello|Burkard, Dell’Amico &amp; Martello]] ''38.'' In der Referenz ist die Methode zum Finden eines verbessernden Pfades wesentlich detaillierter angegeben.&lt;/ref&gt; Weil jeder verbessernde Pfad zu einem gegebenen Matching einen weiteren Knoten matcht und maximal &lt;math&gt;\tfrac{n}{2}&lt;/math&gt; Knoten zu matchen sind, beschränkt sich die Zahl der Schleifendurchläufe [[Asymptotische Laufzeit|asymptotisch]] durch &lt;math&gt;\mathcal{O}(n)&lt;/math&gt;. Eine sehr naive Methode zum Finden verbessernder Pfade stellen sogenannte [[Suchverfahren in Graphen|Graph Scans]] dar, etwa eine Breitensuche (BFS) mit einer Laufzeit von &lt;math&gt;\mathcal{O}(n+m)&lt;/math&gt;. Ferner ist &lt;math&gt;m\in \mathcal{O}(n^2)&lt;/math&gt;, weil der Graph bipartit ist und damit ist die angegebene Methode in &lt;math&gt;\mathcal{O}(n^3)&lt;/math&gt;.<br /> <br /> Einer der frühesten Beiträge zum Berechnen von Maximum-Matchings, der über die oben angeführte naive Methode hinausgeht, war der [[Algorithmus von Hopcroft und Karp]] 1973.&lt;ref&gt;{{Cite journal<br /> | doi = 10.1137/0202019<br /> | issn = 0097-5397<br /> | volume = 2<br /> | issue = 4<br /> | pages = 225–231<br /> | last = Hopcroft<br /> | first = John E.<br /> | coauthors = Richard M. Karp<br /> | title = An &lt;math&gt;n^{5/2}&lt;/math&gt; Algorithm for Maximum Matchings in Bipartite Graphs<br /> | journal = SIAM Journal on Computing<br /> | date = 1973<br /> }}&lt;/ref&gt; Die Grundidee folgt dem [[Algorithmus von Dinic]], der in jeder Phase, wo der Algorithmus nach einem verbessernden Pfad sucht (Zeile 2), möglichst kurze Pfade und nach Möglichkeit „mehrere gleichzeitig“ sucht.<br /> <br /> Alt, Blum, Mehlhorn &amp; Paul 1991&lt;ref&gt;{{Cite journal<br /> | doi = 10.1016/0020-0190(91)90195-N<br /> | issn = 0020-0190<br /> | volume = 37<br /> | issue = 4<br /> | pages = 237–240<br /> | last = Alt<br /> | first = H.<br /> | coauthors = N. Blum, K. Mehlhorn, M. Paul<br /> | title = Computing a maximum cardinality matching in a bipartite graph in time &lt;math&gt;\mathcal{O}(n^{1.5}\sqrt{m/\log n})&lt;/math&gt;<br /> | journal = Information Processing Letters<br /> | date = 1991<br /> }}&lt;/ref&gt; schlagen eine Verbesserung von Hopcroft &amp; Karp vor, indem sie ein Scanningverfahren für [[Adjazenzmatrizen]] nach Cheriyan, Hagerup, and Mehlhorn 1990&lt;ref&gt;{{Cite book<br /> | publisher = Springer-Verlag<br /> | isbn = 3-540-52826-1<br /> | volume = 443<br /> | pages = 235–248<br /> | last = Cheriyan<br /> | first = Joseph<br /> | coauthors = Torben Hagerup, Kurt Mehlhorn<br /> | title = Automata, Languages and Programming<br /> | chapter = Can a maximum flow be computed in &lt;math&gt;\mathcal{O}(nm)&lt;/math&gt; time?<br /> | location = Berlin/Heidelberg<br /> | date = 1990<br /> }}&lt;/ref&gt; anwenden. Eine einfache Beschreibung der Methode findet sich auch in [[#Burkard, Dell’Amico &amp; Martello|Burkard, Dell’Amico &amp; Martello]] ''47 ff.'' Feder und Motwani 1991&lt;ref&gt;{{Cite conference<br /> | publisher = ACM<br /> | doi = 10.1145/103418.103424<br /> | isbn = 0-89791-397-3<br /> | pages = 123–133<br /> | last = Feder<br /> | first = Tomás<br /> | coauthors = Rajeev Motwani<br /> | title = Clique partitions, graph compression and speeding-up algorithms<br /> | booktitle = Proceedings of the twenty-third annual ACM symposium on Theory of computing<br /> | location = New York<br /> | date = 1991<br /> }}&lt;/ref&gt; haben eine Methode vorgeschlagen, die auf der Zerlegung von &lt;math&gt;G&lt;/math&gt; in bipartite [[Clique (Graphentheorie)|Cliquen]] beruht und erreichen damit eine asymptotische Laufzeit von &lt;math&gt;\mathcal{O}( \sqrt{n} m \log(n^2 /m)/ \log n)&lt;/math&gt;. Eine Methode, die ''nicht'' auf der Idee augmentierender Pfade beruht, sondern sogenannte „starke [[Spannbaum|Spannbäume]]“ benutzt, haben Balinski &amp; Gonzalez 1991&lt;ref&gt;{{Cite journal<br /> | doi = 10.1002/net.3230210203<br /> | issn = 1097-0037<br /> | volume = 21<br /> | issue = 2<br /> | pages = 165–179<br /> | last = Balinski<br /> | first = M. L<br /> | coauthors = J. Gonzalez<br /> | title = Maximum matchings in bipartite graphs via strong spanning trees<br /> | journal = Networks<br /> | date = 1991<br /> }}&lt;/ref&gt; vorgeschlagen und erreichen damit eine Laufzeit von &lt;math&gt;\mathcal{O}(n^3)&lt;/math&gt;.<br /> <br /> == Allgemeiner Fall ==<br /> === Satz von Tutte ===<br /> {{Hauptartikel|Satz von Tutte}}<br /> <br /> Während Charakterisierungen von Matchings und effiziente Algorithmen zum Bestimmen relativ schnell nach der Formulierung von Matchings als Problem gefunden wurden, dauerte es bis 1947 bis Tutte&lt;ref name=&quot;tutte&quot;&gt;{{Cite journal<br /> | volume = 1<br /> | issue = 2<br /> | pages = 107<br /> | last = Tutte<br /> | first = W. T<br /> | title = The factorization of linear graphs<br /> | journal = Journal of the London Mathematical Society<br /> | date = 1947<br /> }}&lt;/ref&gt; eine Charakterisierung für perfekte Matchings in allgemeinen Graphen formulieren und beweisen konnte. Aus diesem tiefliegenden Resultat lassen sich alle bisher besprochenen vergleichsweise leicht herleiten.&lt;ref&gt;[[#Lovász &amp; Plummer|Lovász &amp; Plummer]] ''84.''&lt;/ref&gt; Tutte benutzt die einfache Tatsache, dass eine Komponente mit ungerader Knotenzahl in einem Graphen kein perfektes Matching haben kann. Wenn also eine Knotenmenge &lt;math&gt;S&lt;/math&gt; so gefunden werden kann, dass &lt;math&gt;G-S&lt;/math&gt; mehr ungerade Komponenten als &lt;math&gt;S&lt;/math&gt; Knoten hat, dann müsste für ein perfektes Matching aus jeder solcher Komponente wenigstens ein Knoten mit einem Knoten aus &lt;math&gt;S&lt;/math&gt; gematcht werden und das kann nicht sein. Es stellt sich heraus, dass die Existenz einer solchen Menge &lt;math&gt;S&lt;/math&gt; Graphen ohne perfektes Matching nicht nur beschreibt, sondern charakterisiert:<br /> <br /> : Ein Graph &lt;math&gt;G&lt;/math&gt; hat genau dann ein perfektes Matching, wenn für jede Menge &lt;math&gt;T\subseteq V(G)&lt;/math&gt; gilt: &lt;math&gt;c(G-T) \le | T |&lt;/math&gt;. (&lt;math&gt;c&lt;/math&gt; gibt die Anzahl der ungeraden Komponenten eines Graphen an.) (5)<br /> <br /> Eine solche Menge &lt;math&gt;T&lt;/math&gt; heißt ''Tutte-Menge'' und die Bedingung in (5) heißt ''Tutte-Bedingung.'' Dass sie [[Notwendige Bedingung|notwendig]] für die Existenz perfekter Matching ist, wurde schon skizziert und es gibt mittlerweile viele Beweise dafür, dass die Bedingung hinreichend ist: Tuttes ursprünglicher Beweis formulierte das Problem als ein Matrix-Problem und benutzte die Idee der [[Pfaffsche Determinante|pfaffschen Determinante]].&lt;ref name=&quot;tutte&quot; /&gt; [[Elementare Mathematik|Elementare]] Abzählargumente wurden relativ rasch danach veröffentlicht, wie in Maunsell 1952,&lt;ref&gt;{{Cite journal<br /> | volume = 1<br /> | issue = 1<br /> | pages = 127<br /> | last = Maunsell<br /> | first = F. G.<br /> | title = A note on Tutte’s paper “The factorization of linear graphs”<br /> | journal = Journal of the London Mathematical Society<br /> | date = 1952<br /> }}&lt;/ref&gt; Tutte 1952,&lt;ref&gt;{{Cite journal<br /> | pages = 164–178<br /> | first = W. T.<br /> | last = Tutte<br /> | title = The factors of graphs<br /> | journal = Classic Papers in Combinatorics<br /> | date = 1987<br /> }}&lt;/ref&gt; Gallai 1963,&lt;ref name=&quot;gallai&quot;&gt;{{Cite journal<br /> | volume = 8<br /> | pages = 135–139<br /> | last = Gallai<br /> | first = T.<br /> | title = Neuer Beweis eines Tutte’schen Satzes, Magyar Tud<br /> | journal = Akad. Kutató Int. Közl<br /> | date = 1963<br /> }}&lt;/ref&gt; Halton 1966&lt;ref&gt;{{Cite journal<br /> | doi = 10.1017/S0305004100040342<br /> | volume = 62<br /> | issue = 04<br /> | pages = 683–684<br /> | last = Halton<br /> | first = John H.<br /> | title = A Combinatorial Proof of a Theorem of Tutte<br /> | journal = Mathematical Proceedings of the Cambridge Philosophical Society<br /> | date = 1966<br /> }}&lt;/ref&gt; oder Balinski 1970.&lt;ref&gt;{{Cite journal<br /> | volume = 12<br /> | pages = 570–572<br /> | last = Balinski<br /> | first = M. L.<br /> | title = On perfect matchings<br /> | journal = SIAM Review<br /> | date = 1970<br /> }}&lt;/ref&gt; Andere Beweise, wie Gallai 1963,&lt;ref name=&quot;gallai&quot; /&gt; Anderson 1971&lt;ref&gt;{{Cite journal<br /> | volume = 10<br /> | issue = 3<br /> | pages = 183–186<br /> | last = Anderson<br /> | first = I.<br /> | title = Perfect matchings of a graph<br /> | journal = Journal of Combinatorial Theory, Series B<br /> | date = 1971<br /> }}&lt;/ref&gt; oder Marder 1973&lt;ref&gt;{{Cite journal<br /> | doi = 10.1007/BF01428195<br /> | issn = 0025-5831<br /> | volume = 201<br /> | issue = 4<br /> | pages = 269–282<br /> | last = Mader<br /> | first = W.<br /> | title = 1-Faktoren von Graphen<br /> | journal = Mathematische Annalen<br /> | date = 1973-12<br /> }}&lt;/ref&gt; verallgemeinern den Satz (4) von Hall systematisch. Ferner gibt es Beweise aus der Perspektive der Graphentheorie, die die Struktur von Graphen betrachten, die selbst kein Perfektes Matching besitzen, doch falls eine Kante ergänzt wird hat der resultierende Graph ein solches. Diesen Ansatz verfolgen etwa Hetyei 1972&lt;ref&gt;{{Cite journal<br /> | volume = 16<br /> | pages = 3–6<br /> | last = Hetyei<br /> | first = G.<br /> | title = A new proof of a factorization theorem<br /> | journal = Acta Acad. Paedagog. Civitate Pécs Ser. 6 Math. Phys. Chem. Tech<br /> | date = 1972<br /> }}&lt;/ref&gt; oder Lovász 1975.&lt;ref&gt;{{Cite journal<br /> | volume = 19<br /> | issue = 3<br /> | pages = 269–271<br /> | last = Lovasz<br /> | first = L.<br /> | title = Three short proofs in graph theory<br /> | journal = Journal of Combinatorial Theory, Series B<br /> | date = 1975<br /> }}&lt;/ref&gt;<br /> [[Datei:Blossom Counter.svg|mini|Es genügt nicht, ''erst'' alle Blüten zu suchen und zu kontrahieren und ''dann'' eine Breitensuche zu fahren. Die Priorität der Fallunterscheidungen spielt eine Rolle für die Korrektheit des Algorithmus.&lt;ref&gt;[[#Jungnickel|Jungnickel]] ''409.''&lt;/ref&gt; In diesem Beispiel enthält der kontrahierte Graph keinen augmentierenden Pfad, wohl aber der Ausgangsgraph.]]<br /> <br /> === Algorithmus von Edmonds ===<br /> Der erste [[Polynomialzeit]]algorithmus für das klassische Matchingproblem stammt von [[Jack Edmonds]] (1965).&lt;ref&gt;{{Cite journal<br /> | doi = 10.4153/CJM-1965-045-4<br /> | volume = 17<br /> | issue = 3<br /> | pages = 449–467<br /> | last = Edmonds<br /> | first = J.<br /> | title = Paths, trees, and flowers<br /> | journal = Canadian Journal of mathematics<br /> | date = 1965<br /> }}&lt;/ref&gt; Die Grundstruktur der Methode entspricht Algorithmus (I): Sie sucht verbessernde Pfade und gibt ein maximum Matching zurück, falls kein solcher gefunden werden kann. Einen verbessernden Pfad zu finden, stellt sich hier aber als schwieriger heraus als im bipartiten Fall, weil einige neue Fälle auftreten können. Edmonds Suchmethode konstruiert nach und nach einen ''alternierenden [[Wald (Graphentheorie)|Wald]].'' Das ist ein kreisfreier Graph &lt;math&gt;F&lt;/math&gt; mit so vielen Zusammenhangskomponenten wie es freie Knoten gibt. Jeder freie Knoten ist [[Wurzel (Graphentheorie)|Wurzel]] &lt;math&gt;r_i&lt;/math&gt; eines [[Baum (Graphentheorie)|Baumes]] &lt;math&gt;T\subset F&lt;/math&gt; und &lt;math&gt;F&lt;/math&gt; ist so konstruiert, dass für alle anderen Knoten &lt;math&gt;v\in F&lt;/math&gt; der eindeutig bestimmte &lt;math&gt;r_i&lt;/math&gt;-&lt;math&gt;v&lt;/math&gt;-Pfad ein alternierender Pfad ist. Ein Knoten in &lt;math&gt;v\in F&lt;/math&gt; heißt dann ''innen'' oder ''ungerade,'' falls &lt;math&gt;\operatorname{d}(r_i,v)\equiv 1\mod 2&lt;/math&gt; und andernfalls ''außen'' oder ''gerade.'' &lt;math&gt;\operatorname{d}&lt;/math&gt; sei hier die Distanzfunktion in &lt;math&gt;T&lt;/math&gt;, gebe also die Länge des eindeutig bestimmten &lt;math&gt;r_i&lt;/math&gt;-&lt;math&gt;v&lt;/math&gt;-Pfades an.<br /> <br /> Es genügt die Betrachtung auf die Konstruktion eines alternierenden Baumes zu reduzieren. Falls diese Konstruktion keinen augmentierenden Pfad findet, wird sie mit einem neuen freien Knoten reinitialisiert und alle bereits betrachteten Kanten werden ignoriert. Existiert kein freier Knoten mehr, dann existiert auch kein augmentierender Pfad. Diesen alternierenden Baum konstruiert Edmonds, indem er ausgehend von einem freien Knoten nach und nach alle Kanten hinzufügt oder ignoriert. Dabei können für eine neue Kante &lt;math&gt;e=uv&lt;/math&gt; (&lt;math&gt;u&lt;/math&gt; gehöre bereits zum Baum) folgende Fälle auftreten:<br /> <br /> # Wenn &lt;math&gt;u&lt;/math&gt; ein innerer Knoten ist, können nur Kanten &lt;math&gt;e\in M&lt;/math&gt; zu &lt;math&gt;T&lt;/math&gt; hinzugefügt werden, weil &lt;math&gt;T&lt;/math&gt; alternierend werden soll. Diese Kante ist eindeutig durch &lt;math&gt;(u~\operatorname{match}(u))&lt;/math&gt; gegeben.<br /> # Falls &lt;math&gt;u&lt;/math&gt; ein äußerer Knoten ist, dann kann &lt;math&gt;v&lt;/math&gt;&amp;nbsp;…<br /> ## frei sein und noch nicht in &lt;math&gt;T&lt;/math&gt;. Dann ist der &lt;math&gt;r&lt;/math&gt;-&lt;math&gt;v&lt;/math&gt;-Pfad augmentierend.<br /> ## gepaart sein und weder &lt;math&gt;v&lt;/math&gt; noch &lt;math&gt;\operatorname{match}(v)&lt;/math&gt; ist in &lt;math&gt;T&lt;/math&gt;. Dann können &lt;math&gt;v&lt;/math&gt; und &lt;math&gt;\operatorname{match}(v)&lt;/math&gt; zu &lt;math&gt;T&lt;/math&gt; hinzugefügt werden.<br /> ## bereits in &lt;math&gt;T&lt;/math&gt; als innerer Knoten enthalten sein. Damit schließt &lt;math&gt;e&lt;/math&gt; einen geraden Kreis. Diese Kanten können ignoriert werden.&lt;ref&gt;[[#Jungnickel|Jungnickel]] ''396.''&lt;/ref&gt;<br /> ## bereits in &lt;math&gt;T&lt;/math&gt; als ein äußerer Knoten enthalten sein. Dann schließt &lt;math&gt;e&lt;/math&gt; einen ungeraden alternierenden Kreis &lt;math&gt;B&lt;/math&gt;; eine sogenannte ''Blüte.'' Edmonds zieht die Knoten in &lt;math&gt;B&lt;/math&gt; zu einem Pseudoknoten &lt;math&gt;b&lt;/math&gt; zusammen mit den Inzidenzen aller Knoten aus &lt;math&gt;B&lt;/math&gt;. (Diese Operation lässt sich auch beschreiben als „Bildung des [[Quotientengraph]]en“ &lt;math&gt;G'=G/B&lt;/math&gt;) Er reinitialisiert dann die Suche in &lt;math&gt;G'&lt;/math&gt; und gibt ein Verfahren an, einen dort gefundenen augmentierenden Pfad &lt;math&gt;P'&lt;/math&gt; zu einem augmentierenden Pfad &lt;math&gt;P&lt;/math&gt; in &lt;math&gt;G&lt;/math&gt; zu liften.<br /> <br /> Blüten können, anders als bei Fall &lt;math&gt;3&lt;/math&gt;, nicht ignoriert werden.&lt;ref&gt;Betrachte [[:Datei:Blossoms can't be ignored.svg|dieses Beispiel]] nach [[#Jungnickel|Jungnickel]] ''398.''&lt;/ref&gt; Der Knoten, der die Blüte mit dem Baum verbindet, lässt sich in das Schema der inneren und äußeren Knoten nicht einordnen. Die naheliegende Idee, ihn als „sowohl innen als auch außen“ zu behandeln führt zu einem falschen Algorithmus.&lt;ref&gt;Diese Idee wurde in {{Cite book<br /> | isbn = 3-486-23911-2<br /> | pages = 103–114<br /> | last = Pape<br /> | first = U.<br /> | coauthors = D. Conradt<br /> | title = Ausgewählte Operations Research Software in FORTRAN<br /> | chapter = Maximales Matching in Graphen<br /> | location = Oldenbourg<br /> | date = 1979<br /> }} vorgeschlagen. [[#Jungnickel|Jungnickel]] ''399'' hat ein Gegenbeispiel, das auf Christian Fremuth-Paeger zurückgeht.&lt;/ref&gt; Die Behandlung von Blüten mit Kontraktion ist neben dem Ansatz von Berge ''die'' zentrale Idee von Edmonds’ Algorithmus und Grundlage vieler späterer Verfahren. Bipartite Graphen enthalten keine ungeraden Kreise und damit auch keine Blüten. Edmonds’ Algorithmus reduziert sich daher im bipartiten Fall auf die Methode von Munkres.<br /> <br /> Man kann ablesen, dass die skizzierte Methode von Edmonds einen Aufwand von &lt;math&gt;\mathcal{O}(n^4)&lt;/math&gt; hat. In Fall &lt;math&gt;2.4&lt;/math&gt; reinitialisiert Edmonds die Suche und verwirft damit den bereits geleisteten Suchaufwand. [[Harold N. Gabow|Gabow]] 1976&lt;ref&gt;{{Cite journal<br /> | doi = 10.1145/321941.321942<br /> | issn = 0004-5411<br /> | volume = 23<br /> | issue = 2<br /> | pages = 221–234<br /> | last = Gabow<br /> | first = Harold N.<br /> | title = An Efficient Implementation of Edmonds’ Algorithm for Maximum Matching on Graphs<br /> | journal = Journal of the ACM<br /> | date = 1976-04<br /> }}&lt;/ref&gt; und [[#Lawler|Lawler]] haben eine naive Implementierung vorgeschlagen, die den Suchaufwand nicht verwirft und eine Laufzeit von &lt;math&gt;\mathcal{O}(n^3)&lt;/math&gt; erreicht. Das Beispiel folgt bereits dieser Methode.<br /> <br /> &lt;gallery perrow=&quot;2&quot; caption=&quot;Beispiel zu Edmonds&quot; widths=&quot;300%&quot;&gt;<br /> Edmonds-example-0.svg&lt;math&gt;G&lt;/math&gt; bleibt unverändert.<br /> Edmonds-example-0.svg&lt;math&gt;G&lt;/math&gt; bleibt unverändert.<br /> Edmonds-example-t2.svg&lt;math&gt;5&lt;/math&gt; und&lt;math&gt;6&lt;/math&gt; sowie &lt;math&gt;4&lt;/math&gt; und &lt;math&gt;14&lt;/math&gt; werden wie eben nach Fall &lt;math&gt;2.2&lt;/math&gt; hinzugefügt. &lt;math&gt;(6~4)&lt;/math&gt; schließt einen geraden Kreis und wird nach &lt;math&gt;2.3&lt;/math&gt; ignoriert. Die Kante &lt;math&gt;(4~5)&lt;/math&gt; kann nach Fall &lt;math&gt;1.1&lt;/math&gt; ignoriert werden.<br /> Edmonds-example-0.svg&lt;math&gt;G&lt;/math&gt; bleibt unverändert.<br /> Edmonds-example-0.svg&lt;math&gt;G&lt;/math&gt; zieht eine Blüte zusammen.<br /> Edmonds-example-t4.svg&lt;math&gt;13~10&lt;/math&gt; wird nach Fall &lt;math&gt;1&lt;/math&gt; ignoriert und &lt;math&gt;12~10&lt;/math&gt; nach Fall &lt;math&gt;2.3&lt;/math&gt;. &lt;math&gt;12~11&lt;/math&gt; schließt eine Blüte &lt;math&gt;B&lt;/math&gt;.<br /> Edmonds-example-1.svg|Der reduzierte Graph &lt;math&gt;G'=G/B&lt;/math&gt;.<br /> Edmonds-example-t5.svg&lt;math&gt;b~7&lt;/math&gt; wird nach &lt;math&gt;2.3&lt;/math&gt; ignoriert.<br /> Edmonds-example-2.svg&lt;math&gt;G'&lt;/math&gt; mit einer weiteren Blüte &lt;math&gt;B'&lt;/math&gt;.<br /> Edmonds-example-t5.svg&lt;math&gt;b~8&lt;/math&gt; schließt wieder eine Blüte &lt;math&gt;B'&lt;/math&gt;. Blüten können auch Pseudoknoten enthalten.<br /> Edmonds-example-3.svg|Der weiter reduzierte Graph &lt;math&gt;G''=G'/B'&lt;/math&gt;<br /> Edmonds-example-t7.svg|Von &lt;math&gt;b'&lt;/math&gt; wird der freie Knoten &lt;math&gt;9&lt;/math&gt; gefunden, der nach Fall &lt;math&gt;2.1&lt;/math&gt; in &lt;math&gt;G''&lt;/math&gt; den augmentierenden Pfad &lt;math&gt;P''=(1~2~b'~9)&lt;/math&gt; schließt. Die Liftung dieses Pfades liefert &lt;math&gt;P=(1~2~3~5~6~7~8~9)&lt;/math&gt; zunächst in &lt;math&gt;G'&lt;/math&gt;, der aber auch schon in &lt;math&gt;G&lt;/math&gt; selbst liegt.<br /> &lt;/gallery&gt;<br /> <br /> == Literatur ==<br /> {{Anker|Lovász &amp; Plummer}}<br /> *{{Cite book<br /> | edition = 1<br /> | publisher = Elsevier Science und Akadémiai Kiadó Budapest<br /> | isbn = 0-444-87916-1<br /> | last = Lovász<br /> | first = L.<br /> | coauthors = M. D Plummer<br /> | title = Matching Theory<br /> | location = Budapest<br /> | series = Annals of Discrete Mathematics<br /> | date = 1986<br /> }}<br /> *{{Cite book<br /> | edition = 3., neu bearb. und erw. A.<br /> | publisher = Springer, Berlin<br /> | isbn = 3-540-21391-0<br /> | last = Diestel<br /> | first = Reinhard<br /> | title = Graphentheorie<br /> | date = 2006<br /> | url = http://diestel-graph-theory.com/german/index.html<br /> }}{{Anker|Jungnickel}}<br /> *{{Cite book<br /> | edition = 3<br /> | publisher = Springer<br /> | isbn = 978-3-540-72779-8<br /> | volume = 5<br /> | last = Jungnickel<br /> | first = Dieter<br /> | title = Graphs, Networks and Algorithms<br /> | series = Algorithms and Computation in Mathematics<br /> | date = 2007<br /> }}{{Anker|Yu &amp; Liu}}<br /> *{{Cite book<br /> | edition = 1<br /> | publisher = Springer<br /> | isbn = 3-540-93951-2<br /> | last = Yu<br /> | first = Qinglin Roger<br /> | coauthors = Guizhen Liu<br /> | title = Graph Factors and Matching Extensions<br /> | location = Beijing<br /> | date = 2009<br /> }}{{Anker|Schrijver}}<br /> *{{Cite book<br /> | publisher = Springer<br /> | isbn = 3-540-44389-4<br /> | volume = A<br /> | last = Schrijver<br /> | first = Alexander<br /> | title = Combinatorial Optimization – Polyhedra and Efficiency<br /> | location = Amsterdam<br /> | series = Algorithms and Combinatorics<br /> | date = 2003<br /> }}{{Anker|Bondy &amp; Murty}}<br /> *{{Cite book<br /> | publisher = Springer<br /> | isbn = 1-84996-690-7<br /> | last = Bondy<br /> | first = Adrian<br /> | coauthors = U.S.R. Murty<br /> | title = Graph Theory<br /> | series = Graduate Texts in Mathematics<br /> | date = 2008<br /> | url = http://blogs.springer.com/bondyandmurty/<br /> }}{{Anker|Burkard, Dell’Amico &amp; Martello}}<br /> *{{Cite book<br /> | publisher = Society for Industrial and Applied Mathematics<br /> | isbn = 978-1-61197-222-1<br /> | last = Burkard<br /> | first = Rainer<br /> | coauthors = Mauro Dell’Amico, Silvano Martello<br /> | title = Assignment Problems (Revised reprint)<br /> | location = Philadelphia<br /> | date = 2012<br /> | url = http://www.assignmentproblems.com/<br /> }}{{Anker|Johnson}}<br /> *{{Cite book<br /> | publisher = American Mathematical Society<br /> | isbn = 0-8218-6598-6<br /> | last = Johnson<br /> | first = David S.<br /> | title = Network Flows and Matching: First Dimacs Implementation Challenge<br /> | date = 1993<br /> }}{{Anker|Lawler}}<br /> *{{Cite book<br /> | publisher = Dover Publications<br /> | isbn = 0-03-084866-0<br /> | last = Lawler<br /> | first = Eugene<br /> | title = Combinatorial Optimization: Networks and Matroids<br /> | location = Rocquencourt<br /> | date = 1976<br /> }}<br /> ; Historisch:{{Anker|Kőnig}}<br /> *{{Cite book<br /> | edition = 1. Auflage 1986<br /> | publisher = Teubner Verlagsgesellschaft<br /> | isbn = 3-322-00303-5<br /> | last = Kőnig<br /> | first = Dénes<br /> | title = Theorie der endlichen und unendlichen Graphen – kombinatorische Topologie der Streckenkomplexe.<br /> | location = Leipzig<br /> | series = Teubner Archiv zur Mathematik<br /> | date = 1936<br /> }}{{Anker|Biggs, Lloyd &amp; Wilson}}<br /> *{{Cite book<br /> | publisher = Oxford University Press, USA<br /> | isbn = 0-19-853916-9<br /> | last = Biggs<br /> | first = Norman L.<br /> | coauthors = E. Keith Lloyd, Robin J. Wilson<br /> | title = Graph Theory 1736–1936<br /> | date = 1999<br /> }}<br /> <br /> == Weblinks ==<br /> {{Commonscat|Matching (graph theory)|Matching}}<br /> <br /> == Einzelnachweise ==<br /> &lt;references /&gt;<br /> <br /> == Anmerkungen ==<br /> &lt;references group=&quot;A&quot; /&gt;<br /> <br /> {{Normdaten|TYP=s|GND=4831446-8}}<br /> <br /> [[Kategorie:Grundbegriff (Graphentheorie)]]</div> Flowi https://de.wikipedia.org/w/index.php?title=Dijkstra-Algorithmus&diff=161494571 Dijkstra-Algorithmus 2017-01-10T14:34:50Z <p>Flowi: &quot;durchschnittliche Laufzeit&quot; (bei Fibonacci-Heaps) geändert zu &quot;Laufzeit&quot;: die Laufzeiten des Heaps sind amortisiert (nicht etwa erwartet) und da nur sounsoviele Operationen vom Algorithmus durchgeführt werden, handelt es sich um worst-case-Laufzeit.</p> <hr /> <div>[[Datei:Dijkstra Animation.gif|miniatur|Animation des Dijkstra-Algorithmus]]<br /> Der '''Algorithmus von Dijkstra''' (nach seinem Erfinder [[Edsger W. Dijkstra]]) ist ein [[Algorithmus]] aus der Klasse der [[Greedy-Algorithmus|Greedy-Algorithmen]]&lt;ref&gt;Tobias Häberlein: ''Praktische Algorithmik mit Python.'' Oldenbourg, München 2012, ISBN 978-3-486-71390-9, S. 162 ff.&lt;/ref&gt; und löst das Problem der [[Kürzester Pfad|kürzesten Pfade]] für einen gegebenen Startknoten. Er berechnet somit einen kürzesten Pfad zwischen dem gegebenen Startknoten und einem der (oder allen) übrigen Knoten in einem [[Kantengewichteter Graph|kantengewichteten Graphen]] (sofern dieser keine Negativkanten enthält).<br /> <br /> Für [[Zusammenhang von Graphen|unzusammenhängende]] [[Ungerichteter Graph|ungerichtete Graphen]] ist der Abstand zu denjenigen Knoten unendlich, zu denen kein Pfad vom Startknoten aus existiert. Dasselbe gilt auch für [[Gerichteter Graph|gerichtete]] nicht [[Stark zusammenhängender Graph|stark zusammenhängende Graphen]].<br /> <br /> == Algorithmus ==<br /> <br /> === Informelle Darstellung ===<br /> Die Grundidee des Algorithmus ist es, immer derjenigen Kante zu folgen, die den kürzesten Streckenabschnitt vom Startknoten aus verspricht. Andere Kanten werden erst dann verfolgt, wenn alle kürzeren Streckenabschnitte beachtet wurden. Dieses Vorgehen gewährleistet, dass bei Erreichen eines Knotens kein kürzerer Pfad zu ihm existieren kann. Eine einmal berechnete Distanz zwischen dem Startknoten und einem besuchten Knoten wird nicht mehr geändert. Distanzen zu noch nicht abgearbeiteten Knoten können sich hingegen im Laufe des Algorithmus durchaus verändern, nämlich verringern. Dieses Vorgehen wird fortgesetzt, bis die Distanz des Zielknotens berechnet wurde (''{{lang|en|single-pair shortest path}}'') oder die Distanzen aller Knoten zum Startknoten bekannt sind (''{{lang|en|single-source shortest path}}'').<br /> <br /> [[Datei:Dijkstra's algorithm.svg|miniatur|text-top|hochkant=0.6|Berechnung der kürzesten Wege zum linken Knoten]]<br /> <br /> Der Algorithmus lässt sich durch die folgenden Schritte beschreiben. Es werden sowohl die kürzesten Wegstrecken als auch deren Knotenfolgen berechnet.<br /> <br /> # Weise allen Knoten die beiden Eigenschaften „Distanz“ und „Vorgänger“ zu. Initialisiere die Distanz im Startknoten mit 0 und in allen anderen Knoten mit ∞.<br /> # Solange es noch unbesuchte Knoten gibt, wähle darunter denjenigen mit minimaler Distanz aus und<br /> ## speichere, dass dieser Knoten schon besucht wurde.<br /> ## Berechne für alle noch unbesuchten Nachbarknoten die Summe des jeweiligen Kantengewichtes und der Distanz im aktuellen Knoten.<br /> ## Ist dieser Wert für einen Knoten kleiner als die dort gespeicherte Distanz, aktualisiere sie und setze den aktuellen Knoten als Vorgänger.<br /> ##: Dieser Schritt wird auch als ''Update'' oder ''Relaxieren'' bezeichnet.<br /> <br /> In dieser Form berechnet der Algorithmus ausgehend von einem Startknoten die kürzesten Wege zu allen anderen Knoten. Ist man dagegen nur an dem Weg zu einem ganz bestimmten Knoten interessiert, so kann man in Schritt (2) schon abbrechen, wenn der gesuchte Knoten der aktive ist.<br /> <br /> [[Datei:Dijkstra-negative-edge-weights-error.svg|miniatur|Negative Kantengewichte können zu nicht-optimalen Lösungen führen.]]<br /> <br /> Aufgrund der Eigenschaft, einmal festgelegte Distanzen zum Startknoten nicht mehr zu verändern, gehört der Dijkstra-Algorithmus zu den Greedy-Algorithmen, die in jedem Schritt die momentan aussichtsreichste Teillösung bevorzugen. Anders als manche andere Greedy-Algorithmen berechnet der Dijkstra-Algorithmus jedoch stets die optimale Lösung. Diese Eigenschaft basiert auf der Annahme, dass die kürzesten Teilstrecken zwischen Knoten in einem Pfad zusammen die kürzeste Strecke auf diesem Pfad bilden. Unter der Voraussetzung positiver Kantengewichte ist die Annahme gültig, denn fände man nachträglich einen kürzeren Weg vom Startknoten zu einem Zielknoten, hätte man auch dessen kürzere Teilstrecke früher untersuchen müssen, um den Algorithmus korrekt durchzuführen. Dann hätte man aber über die kürzere Teilstrecke den Zielknoten früher gefunden als auf dem längeren Weg.<br /> <br /> Die Annahme trifft jedoch nicht mehr zu, wenn der Graph negative Kantengewichte enthält. Dann kann jede Teilstrecke für sich zwar eine kürzeste Strecke zwischen den Endpunkten sein, man könnte jedoch über einen längeren Teilweg die Gesamtdistanz verbessern, wenn eine negative Kante die Weglänge wieder reduziert. Im Bild mit den Knoten 1, 2, 3 und 4 würde der Dijkstra-Algorithmus den kürzesten Weg von 1 nach 3 über 2 finden, da der Schritt zu 4 insgesamt schon länger ist als der gesamte obere Pfad. Die negative Kante bewirkt aber, dass der untere Pfad kürzer ist.<br /> <br /> === Algorithmus in Pseudocode ===<br /> Die folgenden Zeilen Pseudocode beschreiben eine Funktion namens ''Dijkstra'', die einen Graphen und einen Startknoten im Graphen als Eingabe erhält. Der Startknoten gibt den Knoten an, von dem aus die kürzesten Wege zu allen Knoten gesucht werden. Das Ergebnis ist eine Liste, die zu jedem Knoten ''v'' den Vorgängerknoten auf dem Weg vom Startknoten zu ''v'' angibt.<br /> <br /> Der Graph besteht aus Knoten und gewichteten Kanten zwischen seinen Knoten. Existiert eine Kante zwischen zwei Knoten, so sind sie jeweils Nachbarn. Das Kantengewicht zwischen benachbarten Knoten ''u'' und ''v'' wird im Pseudocode als ''abstand_zwischen(u,v)'' angegeben.<br /> <br /> Zunächst werden abhängig vom Graphen und Startknoten die Abstände und Vorgänger initialisiert. Dies geschieht in der Methode ''initialisiere''. Der eigentliche Algorithmus verwendet eine Methode ''distanz_update'', die ein Update der Abstände durchführt, falls ein kürzerer Weg gefunden wurde.<br /> <br /> 1 '''Funktion''' Dijkstra(''Graph'', ''Startknoten''):<br /> 2 initialisiere(''Graph'',''Startknoten'',abstand[],vorgänger[],''Q'')<br /> 3 '''solange''' ''Q'' '''nicht''' leer: ''// Der eigentliche Algorithmus''<br /> 4 ''u'':= Knoten in ''Q'' mit kleinstem Wert in abstand[]<br /> 5 entferne ''u'' aus ''Q'' ''// für ''u'' ist der kürzeste Weg nun bestimmt''<br /> 6 '''für jeden''' Nachbarn ''v'' von ''u'':<br /> 7 '''falls''' ''v'' in ''Q'':<br /> 8 distanz_update(''u'',''v'',abstand[],vorgänger[]) ''// prüfe Abstand vom Startknoten zu ''v''''<br /> 9 '''return''' vorgänger[]<br /> <br /> Die Initialisierung setzt die Abstände auf unendlich und die Vorgänger als unbekannt. Nur der Startknoten hat die Distanz&amp;nbsp;0. Die Menge&amp;nbsp;''Q'' enthält die Knoten, zu denen noch kein kürzester Weg gefunden wurde.<br /> <br /> 1 '''Methode''' initialisiere(Graph,Startknoten,abstand[],vorgänger[],Q):<br /> 2 '''für jeden''' Knoten ''v'' in ''Graph'':<br /> 3 abstand[''v'']:= '''unendlich'''<br /> 4 vorgänger[''v'']:= '''null'''<br /> 5 abstand[''Startknoten'']:= 0<br /> 6 ''Q'':= Die Menge aller Knoten in ''Graph''<br /> <br /> Der Abstand vom Startknoten zum Knoten ''v'' verkürzt sich dann, wenn der Weg zu ''v'' über ''u'' kürzer als der bisher bekannte Weg ist. Entsprechend wird ''u'' zum Vorgänger von ''v'' auf dem kürzesten Weg.<br /> <br /> 1 '''Methode''' distanz_update(u,v,abstand[],vorgänger[]):<br /> 2 ''alternativ'':= abstand[''u''] + abstand_zwischen(''u'', ''v'') ''// Weglänge vom Startknoten nach v über u''<br /> 3 '''falls''' ''alternativ'' &lt; abstand[''v'']:<br /> 4 abstand[''v'']:= ''alternativ''<br /> 5 vorgänger[''v'']:= ''u''<br /> <br /> Falls man nur am kürzesten Weg zwischen zwei Knoten interessiert ist, kann man den Algorithmus nach Zeile&amp;nbsp;5 der ''Dijkstra''-Funktion abbrechen lassen, falls ''u''&amp;nbsp;=&amp;nbsp;''Zielknoten'' ist.<br /> <br /> Den kürzesten Weg zu einem ''Zielknoten'' kann man nun durch Iteration über die ''vorgänger'' ermitteln:<br /> <br /> 1 '''Funktion''' erstelleKürzestenPfad(Zielknoten,vorgänger[])<br /> 2 ''Weg[]'':= [Zielknoten]<br /> 3 ''u'':= ''Zielknoten''<br /> 4 '''solange''' vorgänger[''u''] '''nicht''' '''null''': ''// Der Vorgänger des Startknotens ist null''<br /> 5 ''u'':= vorgänger[''u'']<br /> 6 füge ''u'' am Anfang von ''Weg[]'' ein<br /> 7 '''return''' Weg[]<br /> <br /> === Implementierung ===<br /> Knoten und Kanten zwischen Knoten lassen sich meistens durch [[Matrix (Mathematik)|Matrizen]] oder [[Zeiger (Informatik)|Zeigerstrukturen]] darstellen. Auch auf den Vorgänger eines Knotens kann ein Zeiger verweisen. Die Abstände der Knoten können in [[Feld (Datentyp)|Feldern]] gespeichert werden.<br /> <br /> Für eine effiziente Implementierung wird die Menge ''Q'' der Knoten, für die noch kein kürzester Weg gefunden wurde, durch eine [[Vorrangwarteschlange|Prioritätswarteschlange]] implementiert. Die aufwändige Initialisierung findet nur einmal statt, dafür sind die wiederholten Zugriffe auf ''Q'' effizienter. Als Schlüsselwert für den Knoten wird sein jeweiliger Abstand verwendet, der im Pseudocode mit ''abstand[v]'' angegeben ist. Verkürzt sich der Abstand, ist eine teilweise Neusortierung der Warteschlange nötig.<br /> <br /> Als Datenstruktur bietet sich hierfür eine [[Entfernungstabelle]] oder eine [[Adjazenzmatrix]] an.<br /> <br /> == Beispiel ==<br /> <br /> Ein Beispiel für die Anwendung des Algorithmus von Dijkstra ist die Suche nach einem kürzesten Pfad auf einer Landkarte.&lt;ref&gt;[http://motherboard.vice.com/read/the-simple-elegant-algorithm-that-makes-google-maps-possible ''The Simple, Elegant Algorithm That Makes Google Maps Possible.''] Bei: ''[[Vice (Magazin)|VICE]]'' Abgerufen am 24.&amp;nbsp;März 2015.&lt;/ref&gt; Im hier verwendeten Beispiel will man in der unten gezeigten Landkarte von [[Deutschland]] einen kürzesten Pfad von [[Frankfurt am Main|Frankfurt]] nach [[München]] finden.<br /> <br /> Die Zahlen auf den Verbindungen zwischen zwei Städten geben jeweils die Entfernung zwischen den beiden durch die Kante verbundenen Städten an. Die Zahlen hinter den Städtenamen geben die ermittelte Distanz der Stadt zum Startknoten ''Frankfurt'' an, ''oo'' steht dabei für&amp;nbsp;∞, also für unbekannte Distanz. Die hellgrau unterlegten Knoten sind die Knoten, deren Abstand relaxiert wird (also verkürzt wird, falls eine kürzere Strecke gefunden wurde), die dunkelgrau unterlegten Knoten sind diejenigen, zu denen der kürzeste Weg von Frankfurt bereits bekannt ist.<br /> <br /> Die Auswahl des nächsten Nachbarn erfolgt nach dem Prinzip einer Prioritätswarteschlange. Relaxierte Abstände erfordern daher eine Neusortierung.<br /> <br /> &lt;div style=&quot;clear:both;&quot;&gt;&lt;/div&gt;<br /> &lt;gallery caption=&quot;Beispiel&quot; widths=&quot;300&quot; heights=&quot;250&quot; perrow=&quot;2&quot;&gt;<br /> MapGermanyGraph.svg|Ausgangssituation: Nicht-initialisierter Graph mit Startknoten Frankfurt und Zielknoten München<br /> DijkstraStep01.svg|Entfernungen vom Startknoten (Frankfurt) ermitteln (relax), Neusortieren der Prioritätswarteschlange Q (1.&amp;nbsp;Mannheim, 2.&amp;nbsp;Kassel, 3.&amp;nbsp;Würzburg,&amp;nbsp;…)<br /> DijkstraStep02.svg|Mannheim ist der nächstliegende Knoten, relax mit Nachbarknoten Karlsruhe, nächster Vorgänger von Karlsruhe ist nun Mannheim, Neusortieren von Q (1.&amp;nbsp;Karlsruhe, 2.&amp;nbsp;Kassel, 3.&amp;nbsp;Würzburg,&amp;nbsp;…)<br /> DijkstraStep03.svg|Dem Startpunkt nächstliegender zu untersuchender Knoten laut Q ist nun Karlsruhe, relax mit Augsburg, Neusortieren von Q (1.&amp;nbsp;Kassel, 2.&amp;nbsp;Würzburg, 3.&amp;nbsp;Augsburg,&amp;nbsp;…)<br /> DijkstraStep04.svg|Nächstliegender zu untersuchender Knoten ist nun Kassel, relax mit München, Neusortieren von Q (1.&amp;nbsp;Würzburg, 2.&amp;nbsp;Augsburg, 3.&amp;nbsp;München,&amp;nbsp;…)<br /> DijkstraStep05.svg|Nächstliegender zu untersuchender Knoten ist nun Würzburg, relax mit Erfurt und Nürnberg, Neusortieren von Q (1.&amp;nbsp;Nürnberg, 2.&amp;nbsp;Erfurt, 3.&amp;nbsp;Augsburg, 4.&amp;nbsp;München,&amp;nbsp;…)<br /> DijkstraStep06.svg|Nächstliegender zu untersuchender Knoten ist nun Nürnberg, relax mit München und Stuttgart, Neusortieren von Q (1.&amp;nbsp;Erfurt, 2.&amp;nbsp;Augsburg, 3.&amp;nbsp;München, 4.&amp;nbsp;Stuttgart,&amp;nbsp;…)<br /> DijkstraStep07.svg|Nächstliegender zu untersuchender Knoten ist nun Erfurt, relax mit niemandem, Neusortieren von Q (1.&amp;nbsp;Augsburg, 2.&amp;nbsp;München, 3.&amp;nbsp;Stuttgart,&amp;nbsp;…)<br /> DijkstraStep08.svg|Nächstliegender zu untersuchender Knoten ist nun Augsburg, relax mit München, Neusortieren von Q (1.&amp;nbsp;München, 2.&amp;nbsp;Stuttgart&amp;nbsp;…)<br /> DijkstraStep09.svg|Zielknoten soll untersucht werden: Kürzester Weg nach München ist nun bekannt; Rekonstruktion mittels ''erstelleKürzestenPfad()''. Dieser ist: Frankfurt-Würzburg-Nürnberg-München.<br /> &lt;/gallery&gt;<br /> <br /> == Grundlegende Konzepte und Verwandtschaften ==<br /> <br /> Ein alternativer Algorithmus zur Suche kürzester Pfade, der sich dagegen auf das [[Optimalitätsprinzip von Bellman]] stützt, ist der [[Floyd-Warshall-Algorithmus]]. Das Optimalitätsprinzip besagt, dass, wenn der kürzeste Pfad von A nach C über B führt, der Teilpfad A&amp;nbsp;B auch der kürzeste Pfad von A nach B sein muss.<br /> <br /> Ein weiterer alternativer Algorithmus ist der [[A*-Algorithmus]], der den Algorithmus von Dijkstra um eine Abschätzfunktion erweitert. Falls diese gewisse Eigenschaften erfüllt, kann damit der kürzeste Pfad unter Umständen schneller gefunden werden.<br /> <br /> == Berechnung eines Spannbaumes ==<br /> <br /> [[Datei:Dijkstra-MSG-Negativbsp.svg|rechts|Negative Kante sorgt für Unklarheiten bei Knoten ''a''.]]<br /> <br /> Nach Ende des Algorithmus ist in den Vorgängerzeigern ''π'' ein Teil-[[Spannbaum]] der [[Zusammenhang von Graphen|Komponente]] von &lt;math&gt; \left. s \right. &lt;/math&gt; aus kürzesten Pfaden von &lt;math&gt; \left. s \right. &lt;/math&gt; zu allen Knoten der Komponente, die in die Queue aufgenommen wurden, verzeichnet. Dieser Baum ist jedoch nicht notwendigerweise auch minimal, wie die Abbildung zeigt:<br /> <br /> Sei &lt;math&gt; \left. x \right. &lt;/math&gt; eine Zahl größer 0. Minimal spannende Bäume sind entweder durch die Kanten &lt;math&gt; \left\{ a,s \right\} &lt;/math&gt; und &lt;math&gt; \left\{ a,b \right\} &lt;/math&gt; oder &lt;math&gt; \left\{ b,s \right\} &lt;/math&gt; und &lt;math&gt; \left\{ a,b \right\} &lt;/math&gt; gegeben. Die Gesamtkosten eines minimal spannenden Baumes betragen &lt;math&gt; \left. 2 +x \right. &lt;/math&gt;. Dijkstras Algorithmus liefert mit Startpunkt &lt;math&gt; \left. s \right. &lt;/math&gt; die Kanten &lt;math&gt; \left\{ a,s \right\} &lt;/math&gt; und &lt;math&gt; \left\{ b,s \right\} &lt;/math&gt; als Ergebnis. Die Gesamtkosten dieses spannenden Baumes betragen &lt;math&gt;\left. 2+2x \right. &lt;/math&gt;.<br /> <br /> Die Berechnung eines [[Spannbaum|minimalen Spannbaumes]] ist mit dem [[Algorithmus von Prim]] oder dem [[Algorithmus von Kruskal]] möglich.<br /> <br /> == Zeitkomplexität ==<br /> Die folgende Abschätzung gilt nur für Graphen, die keine negativen Kantengewichte enthalten.<br /> <br /> Die Laufzeit des Dijkstra Algorithmus hängt ab von der Anzahl der Kanten &lt;math&gt;|E|&lt;/math&gt; und der Anzahl der Knoten &lt;math&gt;|V|&lt;/math&gt;. Die genaue Zeitkomplexität hängt von der Datenstruktur &lt;math&gt;Q&lt;/math&gt; ab, in der die Knoten gespeichert werden.<br /> Für alle Implementierungen von &lt;math&gt;Q&lt;/math&gt; gilt:<br /> :&lt;math&gt;O(|E| \cdot T_\mathrm{dk} + |V| \cdot T_\mathrm{em})&lt;/math&gt;<br /> wobei &lt;math&gt;T_\mathrm{dk}&lt;/math&gt; und &lt;math&gt;T_\mathrm{em}&lt;/math&gt; für die Komplexität der ''decrease-key'' und ''extract-minimum'' Operationen bei &lt;math&gt;Q&lt;/math&gt; stehen. Die einfachste Implementierung für &lt;math&gt;Q&lt;/math&gt; ist eine Liste oder ein Array. Dabei ist die Zeitkomplexität<br /> &lt;math&gt;O(|E| + |V|^2) = O(|V|^2)&lt;/math&gt;<br /> <br /> Im Normalfall wird man hier auf eine [[Vorrangwarteschlange]] zurückgreifen, indem man dort die Knoten als Elemente mit ihrer jeweiligen bisherigen Distanz als Schlüssel/Priorität verwendet.<br /> <br /> &lt;!--<br /> ''Die nachstehend angegebenen Zeilennummern und Funktionsnamen sind offenbar seit [[Spezial:Diff/49461327|August 2008]] nicht mehr Bestandteil des Artikels.''<br /> <br /> Betrachtet man den Algorithmus unter diesem Aspekt, ergibt sich folgender Aufwand:<br /> <br /> Das „Füllen“ von &lt;math&gt;Q&lt;/math&gt; in Zeile 02 wird dadurch erreicht, dass man jeden Knoten sowie seine Priorität (= Distanz) mittels ''insert'' in die Warteschlange einfügt. Wenn der Graph keine negativen Kantengewichte enthält, dann wird jeder Knoten höchstens einmal in die Warteschlange eingefügt und somit gibt es insgesamt höchstens &lt;math&gt;n&lt;/math&gt; Einfügeoperationen.<br /> <br /> Da in Zeile 04 jeweils ein Knoten aus &lt;math&gt;Q&lt;/math&gt; (bzw. der Warteschlange) entfernt wird, folgt, dass die Schleife in Zeile 03 ebenfalls &lt;math&gt;n&lt;/math&gt; Mal durchlaufen wird (ein evtl. früherer Abbruch wegen Erreichen des Zielknotens sei hier ausgenommen). In jedem Schleifendurchlauf muss geprüft werden, ob die Warteschlange leer ist (''empty'', Zeile 03) und es muss das nächste Element mit der niedrigsten Priorität entfernt werden (''extractMin'', Zeile 04); die beiden Operationen werden also jeweils &lt;math&gt;n&lt;/math&gt;-mal durchgeführt.<br /> <br /> Die Anzahl Aufrufe der relax-Funktion kann zwar für jeden Durchlauf der Schleife in Zeile 07 variieren (da die Anzahl der von jedem Knoten ''u'' ausgehenden Kanten natürlich unterschiedlich sein kann), insgesamt über die Laufzeit des gesamten Algorithmus gesehen wird die Schleife aber &lt;math&gt;m&lt;/math&gt; Mal ausgeführt, da jeder Knoten nur einmal betrachtet wird, und somit jede von ihm ausgehende Kante ebenfalls nur einmal betrachtet werden kann. Es werden somit alle ausgehenden Kanten aller Knoten im Graphen überprüft und damit erhält man natürlich alle Kanten des Graphen, also &lt;math&gt;m&lt;/math&gt; Stück.<br /> <br /> Sollte sich hier die bisher berechnete Distanz des Knotens &lt;math&gt;v&lt;/math&gt; verringern, muss natürlich auch die Priorität in der Warteschlange mittels ''decreaseKey'' entsprechend verringert werden. Das passiert im [[Worst Case]] (im –&amp;nbsp;unwahrscheinlichen&amp;nbsp;– Fall, dass die Überprüfung ''jeder'' Kante einen kürzeren Weg liefert) höchstens &lt;math&gt;m&lt;/math&gt; Mal.<br /> <br /> Der Vollständigkeit halber sollte man außerdem auch noch das Setzen von &lt;math&gt;d\left[v\right]&lt;/math&gt; und &lt;math&gt;\pi\left[v\right]&lt;/math&gt; in der relax Funktion betrachten, jedoch lässt sich dies jeweils in konstanter Zeit mit der Komplexität &lt;math&gt;\mathcal{O}(1)&lt;/math&gt; realisieren.<br /> <br /> Insgesamt ergibt sich also eine Komplexität von &lt;math&gt;\mathcal{O} \left( n\cdot(1 + T_\mathrm{insert}+T_\mathrm{empty}+T_\mathrm{extractMin}) + m\cdot (1 + T_\mathrm{decreaseKey}) \right)&lt;/math&gt;.<br /> <br /> Würde man zur Verwaltung der Knoten nun z.&amp;nbsp;B. einfach eine [[Liste (Datenstruktur)|Liste]] verwenden, ergäbe das eine [[Zeitkomplexität|Laufzeit]] von &lt;math&gt;\mathcal{O}(n^2 + m)&lt;/math&gt;; ''insert'', ''empty'' und ''decreaseKey'' lassen sich alle in &lt;math&gt;\mathcal{O}(1)&lt;/math&gt; realisieren, das Suchen des Elements mit der kleinsten Priorität erfordert eine lineare Suche mit &lt;math&gt;\mathcal{O}(n)&lt;/math&gt;.<br /> <br /> Besser fährt man hier mit der Verwendung der [[Datenstruktur]] [[Fibonacci-Heap]]. Diese ermöglicht es ebenfalls, die Operationen ''insert'', ''empty'' und ''decreaseKey'' ([[Amortisierte Laufzeitanalyse|amortisiert]] betrachtet) in &lt;math&gt;\mathcal{O}(1)&lt;/math&gt; zu realisieren, die Komplexität von ''extractMin'' ist hier &lt;math&gt;\mathcal{O}(\log n)&lt;/math&gt;. Die gesamte Laufzeit beträgt dann lediglich &lt;math&gt;\mathcal{O}(n\cdot\log n + m)&lt;/math&gt;. --&gt;&lt;br&gt;<br /> Die optimale Laufzeit für einen Graphen &lt;math&gt;G = (V, E)&lt;/math&gt; beträgt &lt;math&gt;O(|V| \log(|V|) + |E|)&lt;/math&gt; &lt;ref&gt;{{Literatur|Autor=Thomas H. Cormen|Titel=Introduction to Algorithms|Hrsg=|Sammelwerk=|Band=|Nummer=|Auflage=|Verlag=MIT Press|Ort=|Datum=|Seiten=663|ISBN=}}&lt;/ref&gt; mittels Verwendung eines [[Fibonacci-Heap]] für den Dijkstra-Algorithmus.<br /> <br /> == Anwendungen ==<br /> <br /> [[Routenplaner]] sind ein prominentes Beispiel, bei dem dieser Algorithmus eingesetzt werden kann. Der Graph repräsentiert hier das Verkehrswegenetz, das verschiedene Punkte miteinander verbindet. Gesucht ist die kürzeste Route zwischen zwei Punkten.<br /> <br /> Einige [[Topologischer Deskriptor|topologische Indizes]], etwa der [[Balaban-J-Index|J-Index]] von Balaban, benötigen gewichtete Distanzen zwischen den Atomen eines [[Molekül]]s. Die Gewichtung ist in diesen Fällen die Bindungsordnung.<br /> <br /> Dijkstras Algorithmus wird auch im [[Internet]] als [[Routing]]-Algorithmus im [[Open Shortest Path First|OSPF]]- und [[Optimized Link State Routing|OLSR]]-Protokoll eingesetzt. Das letztere ''Optimized Link State Routing''-Protokoll ist eine an die Anforderungen eines mobilen drahtlosen LANs angepasste Version des [[Link-State|Link State Routing]]. Es ist wichtig für mobile [[Ad-hoc-Netz]]e. Eine mögliche Anwendung davon sind die [[Freies Funknetz|freien Funknetze]].<br /> <br /> Auch bei der Lösung des [[Münzproblem]]s, eines zahlentheoretischen Problems, das auf den ersten Blick nichts mit Graphen zu tun hat, kann der Dijkstra-Algorithmus eingesetzt werden.<br /> <br /> == Andere Verfahren zur Berechnung kürzester Pfade ==<br /> <br /> Hat man genug Informationen über die Kantengewichte im Graphen, um daraus eine [[Heuristik]] für die Kosten einzelner Knoten ableiten zu können, ist es möglich, den Algorithmus von Dijkstra zum [[A*-Algorithmus]] zu erweitern. Um alle kürzesten Pfade von einem Knoten zu allen anderen Knoten in einem Graphen zu berechnen, kann man auch den [[Bellman-Ford-Algorithmus]] verwenden, der mit negativen Kantengewichten umgehen kann. Der [[Algorithmus von Floyd und Warshall]] berechnet schließlich die kürzesten Pfade aller Knoten zueinander.<br /> <br /> == Algorithmen zum Auffinden minimaler Spannbäume ==<br /> <br /> * [[Algorithmus von Kruskal]]<br /> * [[Algorithmus von Borůvka]]<br /> * [[Algorithmus von Prim]]<br /> <br /> == Literatur ==<br /> * {{BibISBN|3486275151|Seite=598–604}}<br /> * [[Edsger W. Dijkstra]]: ''A note on two problems in connexion with graphs.'' In: ''Numerische Mathematik.'' 1, 1959, S. 269–271 ([http://www-m3.ma.tum.de/twiki/pub/MN0506/WebHome/dijkstra.pdf PDF; 739&amp;nbsp;kB])<br /> <br /> == Weblinks ==<br /> <br /> {{Wikibooks|Algorithmensammlung: Graphentheorie: Dijkstra-Algorithmus|Dijkstra-Algorithmus|Implementierungen in der Algorithmensammlung}}<br /> * [https://www-m9.ma.tum.de/graph-algorithms/spp-dijkstra/index_de.html Interaktives Applet zur Lernen, Ausprobieren und Demonstrieren des Algorithmus]<br /> * [http://www.dgp.toronto.edu/~jstewart/270/9798s/Laffra/DijkstraApplet.html Java-Applet zu Dijkstra] (englisch)<br /> * [http://www.uweschmidt.org/dijkstravis Interaktive Visualisierung und Animation von Dijkstras Algorithmus, geeignet für Personen ohne Vorkenntnisse von Algorithmen] (englisch)<br /> * [http://computer.howstuffworks.com/routing-algorithm3.htm Implementierung in C] (englisch)<br /> * [http://algo2.iti.uni-karlsruhe.de/singler/algorithmus-der-woche/Kuerzeste%20Wege.pdf Erklärung anhand eines analogen Modells] (PDF; 213&amp;nbsp;kB)<br /> * [http://jgrapht.org Öffentliche Softwarebibliothek in Java mit diesem und anderen Algorithmen] (englisch)<br /> * [http://sourceforge.net/projects/dijkstromania/ Java Implementierung – Simulation / Auswertung] (englisch)<br /> * [http://www.hann3mann.de/artikel/dijkstra-algorithmus-in-c-csharp/ Implementierung in C#]<br /> <br /> == Einzelnachweise ==<br /> &lt;references /&gt;<br /> <br /> [[Kategorie:Optimierungsalgorithmus|Dijkstra, Algorithmus von]]<br /> [[Kategorie:Graphsuchalgorithmus]]<br /> [[Kategorie:Routing]]<br /> [[Kategorie:Reise- und Routenplanung]]</div> Flowi https://de.wikipedia.org/w/index.php?title=Algorithmus_von_Bor%C5%AFvka&diff=157513558 Algorithmus von Borůvka 2016-08-30T13:32:30Z <p>Flowi: Sortieren ist unnötig und für die Entwicklung schnellerer Algorithmen sogar hinderlich (siehe Eintrag Diskussionsseite). #Teilgerüste wird mindestens (!) halbiert. Mathmode verwendet.</p> <hr /> <div>Der '''Algorithmus von Borůvka''' gilt als erster [[Algorithmus]] zum Auffinden [[Minimaler Spannbaum|minimaler Spannbäume]] in [[Ungerichteter Graph|ungerichteten Graphen]]. Er wurde 1926 von dem tschechischen Mathematiker [[Otakar Borůvka]] beschrieben. Die beiden bekannteren Algorithmen zur Lösung dieses Problems sind der [[Algorithmus von Prim]] und der [[Algorithmus von Kruskal]]. In der Erstveröffentlichung dieser beiden Algorithmen wird Borůvka jeweils erwähnt.<br /> <br /> == Grundprinzip und Komplexität == <br /> Wie auch der Algorithmus von Kruskal startet der Algorithmus von Borůvka mit vielen Teilgerüsten, die aus jeweils einem Knoten der Knotenmenge V des Graphen G = (V, E) bestehen. In jeder nun folgenden [[Iteration]] wird eine kürzeste Kante von einem Teilgerüst zu einem anderen gesucht. Die Auswahl dieser Kanten kann insbesondere bei der Möglichkeit zur parallelen Ausführung simultan geschehen, was den Algorithmus attraktiv für parallele Implementierungen macht. Die so verbundenen Teilgerüste werden zu jeweils einem Teilgerüst verschmolzen. Bei jeder Iteration wird auf diese Weise die Anzahl der Teilgerüste mindestens halbiert, so dass der Algorithmus in maximal &lt;math&gt;\log_2 |V|&lt;/math&gt; Phasen terminiert. Da jede Iteration in &lt;math&gt;\mathcal{O}(|E|)&lt;/math&gt; durchgeführt werden kann, ist die Gesamtkomplexität des Algorithmus insgesamt &lt;math&gt;\mathcal{O}(|E| \log |V|)&lt;/math&gt;.<br /> <br /> == Literatur ==<br /> *Borůvka, Otakar (1926). &quot;O jistém problému minimálním (About a certain minimal problem)&quot;. Práce mor. přírodověd. spol. v Brně III (in Czech, German summary) 3: 37–58.<br /> *Borůvka, Otakar (1926). &quot;Příspěvek k řešení otázky ekonomické stavby elektrovodních sítí (Contribution to the solution of a problem of economical construction of electrical networks)&quot;. Elektronický Obzor (in Czech) 15: 153–154.<br /> *Nešetřil, Jaroslav; Milková, Eva; Nešetřilová, Helena (2001). &quot;Otakar Borůvka on minimum spanning tree problem: translation of both the 1926 papers, comments, history&quot;. Discrete Mathematics 233 (1–3): 3–36. {{doi|10.1016/S0012-365X(00)00224-7}}. <br /> *Choquet, Gustave (1938). &quot;Étude de certains réseaux de routes&quot;. Comptes-rendus de l’Académie des Sciences (in French) 206: 310–313.<br /> * Florek, Kazimierz (1951). &quot;Sur la liaison et la division des points d'un ensemble fini&quot;. Colloquium Mathematicum 2 (1951) (in French): 282–285.<br /> * Sollin, M. (1965). &quot;Le tracé de canalisation&quot;. Programming, Games, and Transportation Networks (in French).<br /> * Eppstein, David (1999). &quot;Spanning trees and spanners&quot;. In Sack, J.-R.; Urrutia, J. Handbook of Computational Geometry. Elsevier. pp. 425–461.<br /> *Mareš, Martin (2004). &quot;Two linear time algorithms for MST on minor closed graph classes&quot;. Archivum mathematicum 40 (3): 315–320.<br /> <br /> [[Kategorie:Graphsuchalgorithmus|Boruvka]]<br /> [[Kategorie:Optimierungsalgorithmus|Boruvka]]</div> Flowi https://de.wikipedia.org/w/index.php?title=Diskussion:Algorithmus_von_Bor%C5%AFvka&diff=157513361 Diskussion:Algorithmus von Borůvka 2016-08-30T13:23:29Z <p>Flowi: Neuer Abschnitt /* Komplexität und Sortieren */</p> <hr /> <div>== Anzahl der Teilgerüste ==<br /> <br /> Meiner Meinung nach verringert sich die Anzahl der Teilgerüste bei Hinzufügen einer Kante lediglich um 1, denn aus zwei Teilgerüsten wird eines (''nicht'' aus ''jeweils'' zwei Teilgerüsten eines). Die Auswahl der beiden Teilgerüste ist ''nicht'' beliebig, sondern es muss tatsächlich die Kante mit dem geringsten Gewicht unter allen Kanten zwischen Teilgerüsten gewählt werden (wie auch beim [[Algorithmus von Kruskal]]), andernfalls wird möglicherweise nicht der minimale Spannbaum gefunden. -- [[Benutzer:Carsten Milkau|Carsten Milkau]] 16:34, 2. Sep. 2008 (CEST)<br /> <br /> == Komplexität und Sortieren ==<br /> <br /> Im Artikel stand bisher, dass man die Kanten in O(|E| log |V|) sortieren &quot;muss&quot;. Es ist überhaupt nicht klar, dass man das &quot;muss&quot;. Außerdem ist O keine untere Schranke...<br /> <br /> Tatsächlich kann man in jeder Iteration das Minimum der aus einer Komponente/Gerüst ausgehenden Kanten bestimmen (in Summe über den ganzen Graphen O(|E|)) und erreicht so (zugegebenermaßen) ebenfalls die O(|E| log |V|).<br /> Interessanterweise kann man aber durch Durchführen von nur O(loglog|V|) Borůvka-Phasen und anschließender Ausführung des Prim-Algorithmus (mit Fibonacci-Heaps) auf dem so kontrahierten Graphen eine Gesamtlaufzeit von O(|E| loglog|V|) erreichen. Dann ist das &quot;Vorab-Sortieren&quot; definitiv nicht optimal! (Bereits zehn Jahre vor Entdeckung der Fibonacci-Heaps hatte Andrew Yao 1974 gezeigt, dass loglog möglich ist durch eine Abwandlung von &quot;Sollins&quot; (Borůvkas) Algorithmus.)<br /> <br /> Ich werde den Artikel dementsprechend ändern. Dieser Eintrag soll als Erklärung für den Edit dienen, wenn Fragen aufkommen.<br /> <br /> [[Benutzer:Flowi|Flowi]] ([[Benutzer Diskussion:Flowi|Diskussion]]) 15:23, 30. Aug. 2016 (CEST)</div> Flowi https://de.wikipedia.org/w/index.php?title=Felix_Leinen&diff=148765541 Felix Leinen 2015-12-04T21:57:16Z <p>Flowi: Links ausgetauscht (einer ohne Login nicht sichtbar, der andere verweist auf den neuen Link)</p> <hr /> <div>[[Datei:Felixleinen.JPG|mini|Felix Leinen]]<br /> '''Felix Leinen''' (* [[15. Mai]] [[1957]] in [[Wiesbaden]]) ist ein deutscher Professor, Diplom-Mathematiker und Politiker ([[Ökologisch-Demokratische Partei|ÖDP]]).<br /> <br /> == Familie und beruflicher Werdegang ==<br /> Leinen studierte von 1976 bis 1982 [[Mathematikstudium|Mathematik]] mit Nebenfach [[Physikstudium|Physik]]. Die [[Promotion (Doktor)|Promotion]] zum Dr.&amp;nbsp;rer.&amp;nbsp;nat. erfolgte 1984 an der [[Albert-Ludwigs-Universität Freiburg|Albert-Ludwigs-Universität]] [[Freiburg im Breisgau]]. Seit 1985 arbeitet er an der Universität Mainz. Leinen ist außerplanmäßiger Professor an der [[Johannes Gutenberg-Universität Mainz|Johannes Gutenberg-Universität]] [[Mainz]]. Zwischenzeitlich hatte er mehrere berufliche Auslandsaufenthalte in England, Italien und den USA.<br /> Nebenbei war von 1974 bis 1984 Helfer beim [[Technisches Hilfswerk|Technischen Hilfswerk]]. Leinen ist verheiratet und hat vier Kinder.<br /> <br /> == Politische Karriere ==<br /> In den späteren 1990er Jahren war er in einer Bürgerinitiative aktiv, die gegen die Umwandlung der in der Stadt Mainz gelegenen ''Laubenheimer Höhe'' (→ [[Mainz-Laubenheim]]) in einen Steinbruch kämpfte. 1999 trat er außerdem der ÖDP bei, deren stellvertretender Bundesvorsitzender er von 2008 bis 2010 war. Er leitet den Bundesarbeitskreis ''Bildungspolitik'' der ÖDP. Leinen ist Schatzmeister der [[Rheinland-Pfalz|rheinland-pfälzischen]] ÖDP und Vorsitzender des ÖDP-Ortsverbands [[Mainz-Hechtsheim]]. Bei der Kommunalwahl von 2009 gelang ihm der Einzug in den [[Mainz]]er Stadtrat, und er behielt sein Mandat in der folgenden Kommunalwahl 2014.<br /> <br /> == Weblinks ==<br /> * [http://www.staff.uni-mainz.de/leinen/AG%20Gruppentheorie/Leinen/ Leinens Internetauftritt] an der Universität Mainz<br /> * [http://www.staff.uni-mainz.de/leinen/AG%20Gruppentheorie/Leinen/Publications.html Publikationsliste] auf seinem Internetauftritt<br /> <br /> {{Normdaten|TYP=p|GND=|GNDName=114371121|GNDfehlt=ja|GNDCheck=2012-12-02}}<br /> <br /> {{SORTIERUNG:Leinen, Felix}}<br /> [[Kategorie:ÖDP-Mitglied]]<br /> [[Kategorie:Hochschullehrer (Johannes Gutenberg-Universität Mainz)]]<br /> [[Kategorie:Person (Technisches Hilfswerk)]]<br /> [[Kategorie:Deutscher]]<br /> [[Kategorie:Geboren 1957]]<br /> [[Kategorie:Mann]]<br /> [[Kategorie:Kommunalpolitiker (Mainz)]]<br /> <br /> {{Personendaten<br /> |NAME=Leinen, Felix<br /> |ALTERNATIVNAMEN=<br /> |KURZBESCHREIBUNG=deutscher Mathematiker und Politiker (ÖDP)<br /> |GEBURTSDATUM=15. Mai 1957<br /> |GEBURTSORT=[[Wiesbaden]]<br /> |STERBEDATUM=<br /> |STERBEORT=<br /> }}</div> Flowi