Prim Algorithmus

Seit den 1990er-Jahren wurden immer mehr Strecken der Deutschen Bahn schrittweise auf ICE Hochgeschwindigkeitsstrecken umgerüstet. Nicht alle Strecken können gleichzeitig ausgebaut werden, aber alle großen Städte sollen schnellstmöglich an das ICE-Netz angeschlossen werden.

Los geht’s

Lerne mit Millionen geteilten Karteikarten

Leg kostenfrei los

Brauchst du Hilfe?
Lerne unseren AI-Assistenten kennen!

Upload Icon

Erstelle automatisch Karteikarten aus deinen Dokumenten.

   Dokument hochladen
Upload Dots

FC Phone Screen

Brauchst du Hilfe mit
Prim Algorithmus?
Frage unseren AI-Assistenten

Review generated flashcards

Leg kostenfrei los
Du hast dein AI Limit auf der Website erreicht

Erstelle unlimitiert Karteikarten auf StudySmarter

StudySmarter Redaktionsteam

Team Prim Algorithmus Lehrer

  • 10 Minuten Lesezeit
  • Geprüft vom StudySmarter Redaktionsteam
Erklärung speichern Erklärung speichern
Inhaltsverzeichnis
Inhaltsverzeichnis

Springe zu einem wichtigen Kapitel

    Hast Du eine Idee für einen Algorithmus, der hier nützlich sein könnte? Wenn nein, dann ein kleiner Hinweis für Dich: Es handelt sich um einen Greedy-Algorithmus, der Prim genannt wird.

    Prim Algorithmus Definition

    Einer der einfachsten Algorithmen zur Lösung des Minimum-Spanning-Tree-Problems ist der Prim-Algorithmus, benannt nach Robert C. Prim von Bell Labs, der ihn 1957 veröffentlichte. Unabhängig von Prim wurde dieser Algorithmus bereits 1930 von Vojtĕch Jarnik entwickelt und später von Edsger Wybe Dijkstra im Jahr 1959.

    Der Algorithmus von Prim ist ein "gieriger" Algorithmus, der den minimalen Spannbaum eines verbundenen gewichteten ungerichteten Graphen effizient berechnet.

    Der Algorithmus von Prim liefert wie der von Kruskal einen minimalen Spannbaum eines ungerichteten Graphen, der einem Greedy-Verfahren entspricht.

    Mehr zum Kruskal Algorithmus findest Du in einer eigenständigen Erklärung auf StudySmarter!

    Minimaler Spannbaum

    Man hört in der Informatik öfter den Begriff minimaler Spannbaum und Du fragst Dich vielleicht: Was genau ist das?

    Minimaler Spannbaum ist eine Art von Graphenproblem. Der minimal aufspannende Baum ist der Baum mit der kleinsten Summe der Kantengewichte. Aber was ist ein Baum? In der Graphentheorie ist ein Baum ein Graph mit N Knoten, die durch genau N-1 Kanten verbunden sind, sodass es genau einen Pfad zwischen den beiden Knoten gibt.

    Gegeben: ungerichteter Graph G = (V , E) , Gewichte w: E ↦ R

    Ein Teilgraph T von G ist ein aufspannender Baum, wenn T ein Baum ist und alle Knoten von G enthält.

    Es gibt normalerweise mehrere verschiedene Möglichkeiten einen Spannbaum für einen Graphen auszuwählen. Man interessiert sich jedoch hauptsächlich dafür, wie man das Gesamtgewicht der Baumkanten minimieren oder maximieren kann. Dieses Problem wird "Minimum Spanning Tree" oder kurz "MST" genannt. Es gibt zwei bekannte Lösungsideen für das MST-Problem:

    • Algorithmus von Prim
    • Algorithmus von Kruskal

    Prim Algorithmus Ablauf

    Die allgemeinen Algorithmusschritte von Prim sind die folgenden:

    • Ausgangspunkt des Algorithmus ist ein beliebiger Startknoten.
    • Alle Kanten benachbarter Knoten werden in die Nachbarliste eingefügt, eine Kante minimaler Länge wird aus der Nachbarliste ausgewählt und diese Kante wird dem initialisierten Spannbaum hinzugefügt.
    • Von dort wird der minimale Pfad basierend auf der ausgewählten Kante zum nächsten Knoten erneut ausgewählt; wenn dieser Knoten bereits besucht wird, wird er ignoriert.
    • Diese Prozedur wird ausgeführt, bis alle Knoten besucht worden sind.

    Der Algorithmus führt n-1 Iterationen durch, wobei n die Anzahl der Knoten im Graphen ist.

    Prim Algorithmus Beispiel

    Hands-On Time! Jetzt kannst Du endlich loslegen. In der nachfolgenden Tabelle findest Du den ganzen Algorithmus-Durchlauf des Beispielgraphen. Alle Kanten, die den nächsten minimalen Baum bilden, werden rot eingefärbt.

    Prim-Algorithmus: DurchlaufBeschreibung
    1. Ausgangsgraph
    2. Der Algorithmus beginnt am Knoten 0. Er prüft benachbarte Kanten (0,1) und (0,3). Er findet, dass die Kante (0,1) das kleinste Gewicht hat (35 < 40) und fügt sie somit in den Baum ein.
    3. Betrachte nun die benachbarten Kanten der Knoten 0 und 1. Hier ist Kante (1,2) die kleinste (10 < 35 < 40). Diese ist nun in der Baumstruktur enthalten und daher rot hinterlegt.
    4. Dabei werden die Kanten (0,3), (1,3), (2,3) und (2,4) betrachtet. (2,3) ist mit einem Gewicht von 20 am kleinsten und daher rot.
    5. Schließlich wird die Kante (3,4) angehoben. Somit ist der generierte Spannbaum vollständig.

    Anwendungsbeispiele für Prim-Algorithmus:

    • Verbindung der Computer eines globalen Unternehmens zu minimalen Kosten (Oberbegriff: Netzwerkdesign)
    • Clustering (z. B. für genetische Distanz)
    • Bildsegmentierung (Image Segmentation)

    Prim Algorithmus Anwendung

    Das bisher Gesehene lässt sich auch in Pseudocode umwandeln.

    Prim-Algorithmus im Pseudocode:

    [R:= ein beliebiger Knoten P]
    [V:= alle n-1 nach P führenden Kanten]
    for i:= 1 to n-1 do
     [Suche billigste Kante w in V (Endknoten sei P) ];
     [Füge w zu R hinzu];
     [Entferne w aus V];
         for[alle Kanten u in V mit Endknoten Q] do
            if[Kosten von Q-P]<[Kosten von u]
             then[Ersetze u durch Q-p]
            end if
         end do
     end do

    Das Ergebnis von Prims Algorithmus ist ein minimaler Spannbaum eines gültigen ungerichteten Graphen. Dieses Verfahren ist effektiver und schneller als Kruskal. Mehr dazu erfährst Du später. Aber bis dahin wartet noch etwas Java-Code auf Dich.

    Prim Algorithmus Java

    Den Prim Algorithmus kannst Du auch in Java implementieren. Dann sieht der Code so aus:

    import java.util.Scanner;
    public class MST{
      static int MAX=100;
      static int MAXWEIGHT=Integer.MAX_VALUE; // Die maximale Integer
      public static void main(String[]args){
            Scanner input=new Scanner(System.in);
            int[][]matrix=new int[MAX][MAX];
            int i,j,k,m,n;
            int weight;
    // Lies die Anzahl der Knoten und Kanten 
            System.out.println("Gib die Anzahl der Knoten und Kanten ein: ");
            m=input.nextInt();
            n=input.nextInt();
     for(i=1;i<=m;i++) // Initialisierungsgraph
     for(j=1;j<=m;j++)
     matrix[i][j]=MAXWEIGHT;
     for(k=0;k<n;k++){

    System.out.print("Gib die Informationen der Kanten "+(k+1)+": "); char cx=input.next().charAt(0); char cy=input.next().charAt(0); weight=input.nextInt(); i=cx-'A'+1; j=cy-'A'+1; matrix[i][j]=weight; matrix[j][i]=weight; } // Berechne den minimalen Spannbaum System.out.println("Der minimale Spannbaum ist: "); weight=PrimAlgorithm(matrix,m); // Ausgabe der minimalen Summe des Gewichtswertes System.out.println("Das Mindestgesamtgewicht ist: "+weight); } public static int PrimAlgorithm(int[][]matrix,int n){ // Notiere das Mindestgewicht der Kante, die mit i endet int[]smallWeight=new int [MAX]; // Notiere den Startpunkt von smallWeight[i] int[]tree=new int[MAX]; int i,j,min,minNum,sum=0; for(i=2;i<=n;i++){ smallWeight[i]=matrix[1][i]; tree[i]=1; // Markiere den Startpunkt aller Knoten als Scheitelpunkt } tree[1]=0; // Knoten 1 tritt dem Spanning Tree bei for(i=2;i<=n;i++){ min=MAXWEIGHT; minNum=0; // Finde den Knoten der Kante mit minimalem Gewicht minNum... for(j=2;j<=n;j++) // ....wenn das Kantengewicht klein ist und nicht im aufspannenden Baum if(smallWeight[j]<min&&smallWeight[j]!=0){

    min=smallWeight[j]; minNum=j; } // Ausgabe der Informationen der Kante des Spannbaums System.out.printf("%c-%c:%d\n",tree[minNum]+'A'-1,min); sum+=min; // Knoten minNum tritt dem Spannbaum bei smallWeight[minNum]=0; // Aktualisiere die Gewichtung des Knotenminimums auf andere Knoten for(j=2;j<=n;j++) // Finde heraus, ob es ein geringeres Gewicht gibt if(matrix[minNum][j]<smallWeight[j]{

    smallWeight[j]=matrix[minNum][j]; tree[j]=minNum; } } return sum; } }

    Als Ausgangsgraph für Prim-Algorithmus kannst Du diesen Graphen verwenden:

    Am Ende bekommst Du folgendes Ergebnis:

    Gib die Anzahl der Knoten und Kanten ein:
    7 12
    Gib die Informationen der Kanten 1: A B 12
    Gib die Informationen der Kanten 2: A F 16
    Gib die Informationen der Kanten 3: A G 14
    Gib die Informationen der Kanten 4: B C 10
    Gib die Informationen der Kanten 5: B F 7
    Gib die Informationen der Kanten 6: C D 3
    Gib die Informationen der Kanten 7: C E 5
    Gib die Informationen der Kanten 8: C F 6
    Gib die Informationen der Kanten 9: D E 4
    Gib die Informationen der Kanten 10: E F 2
    Gib die Informationen der Kanten 11: E G 8
    Gib die Informationen der Kanten 12: G F 9
    Der minimale Spannbaum ist:
    A - B : 12
    B - F : 7
    F - E : 2
    E - D : 4
    D - C : 3
    E - G : 8
    Das Mindestgesamtgewicht ist: 36

    Prim Algorithmus Python

    Natürlich kannst Du auch andere Programmiersprachen verwenden, um den Algorithmus von Prim zu implementieren. Hier ist ein Beispielcode für den Algorithmus von Prim in Python:

    import heapq
    def prim(graph, weights):         # Kantengewichte wie bei Dijkstra als property map
    sum = 0.0                         # wird später das Gewicht des Spannbaums sein
    start = 0                         # Knoten 0 wird willkürlich als Wurzel gewählt
    
           
    parents = [None]*len(graph)       # property map, die den resultierenden Baum kodiert
    parents[start] = start            # Wurzel zeigt auf sich selbst
    
           
    heap = []                         # Heap für die Kanten des Graphen
    for neighbor in graph[start]:     # besuche die Nachbarn von start
        heapq.heappush(heap, (weights[(start, neighbor)], neighbor, start))  # und fülle Heap 
    
        
    while len(heap) > 0:
    w, node, predecessor = heapq.heappop(heap) # hole billigste Kante aus dem Heap
        if parents[node] is not None: # die Kante würde einen Zyklus verursachen
            continue                   #  => ignoriere diese Kante
        parents[node] = predecessor   # füge Kante in den MST ein
        sum += w                      # und aktualisiere das Gesamtgewicht 
        for neighbor in graph[node]:  # besuche die Nachbarn von node
            if parents[neighbor] is None:  # aber nur, wenn kein Zyklus entsteht
                heapq.heappush(heap, (weights[(node,neighbor)], neighbor, node)) # füge Kandidaten in Heap ein
    
    return parents, sum               # MST und Gesamtgewicht zurückgeben

    Prim Algorithmus Laufzeit

    Die Laufzeit des Algorithmus von Prim hängt von der Implementierung der Warteschlange mit minimaler Priorität Q ab. Wenn Q als binärer Mini-Heap implementiert ist, dann ist die Laufzeit von Prims Algorithmus O(E log V). Durch die Verwendung besserer Datenstrukturen (z. B. bei Verwendung von Fibonacci-Heaps als Speicher) kann man mit einer Zeitkomplexität von O(V • log V + E) auskommen.

    Prim vs. Kruskal

    Der Kruskal-Algorithmus verwendet als minimaler Spanning-Tree-Algorithmus eine andere Logik als die von Prim, um die MST eines Graphen zu finden.

    Anstatt bei einem Scheitelpunkt zu beginnen, sortiert Kruskals Algorithmus alle Kanten von niedrigem zu hohem Gewicht und fügt die niedrigsten Kanten hinzu, bis alle Scheitelpunkte abgedeckt sind, wobei Kanten ignoriert werden, aus denen der Zyklus besteht.

    Der Algorithmus von Kruskal folgt einem Greedy-Ansatz und findet bei jedem Schritt die optimale Lösung, indem er sich auf das globale Optimum konzentriert.

    Hier findest Du mögliche Unterschiede zwischen den Algorithmen von Prim und Kruskal in tabellarischer Form.

    Prim-AlgorithmusKruskal-Algorithmus
    Dieser Algorithmus macht es möglich, einen minimalen Spannbaum zu erhalten, indem benachbarte Scheitelpunkte aus bereits ausgewählten Scheitelpunkten ausgewählt werden.Dieser Algorithmus macht es möglich, einen minimalen Spannbaum zu erhalten, aber es ist nicht notwendig, benachbarte Scheitelpunkte der ausgewählten Scheitelpunkte auszuwählen.
    Die Algorithmen von Prim gehen von Knoten zu Knoten.Der Algorithmus von Prim hat eine Zeitkomplexität von O(E log V). und der von Kruskal hat eine Zeitkomplexität von O(log V).
    Der Algorithmus von Prim arbeitet schneller in dichten Graphen.Überquert den Knoten mehrmals, um die Mindestentfernung zu erhalten.Der Algorithmus von Kruskal arbeitet bei spärlichen Graphen schneller.
    Der Algorithmus von Prim wird an einem Knoten initialisiert, während der Algorithmus von Kruskal an einer Kante beginnt.Der Algorithmus von Prim erfordert, dass der Graph ein verbundener Graph ist, aber der Graph von Kruskal funktioniert auch mit nicht verbundenen Graphen.

    Prim Algorithmus – Das Wichtigste

    • Prim-Algorithmus Definition: Einer der einfachsten Algorithmen zur Lösung des Minimum-Spanning-Tree-Problems ist der Prim-Algorithmus.
    • Minimaler Spannbaum: Minimaler Spannbaum ist eine Art von Graphenproblem. Der minimal aufspannende Baum ist der Baum mit der kleinsten Summe der Kantengewichte.
    • Prim-Algorithmus Laufzeit: Durch die Verwendung besserer Datenstrukturen (z. B. bei Verwendung von Fibonacci-Heaps als Speicher) kann man mit einer Zeitkomplexität von O(V • logV + E) auskommen.
    • Prim vs. Kruskal: Der Algorithmus von Prim wird an einem Knoten initialisiert, während der Algorithmus von Kruskal an einer Kante beginnt.

    Nachweise

    1. algorithms.discrete.ma.tum.de: Der Algorithmus von Kruskal. (31.10.2022)
    2. computerix.info: Programmieren C: Kruskal-Algorithmus. (31.10.2022)
    3. fuzzy.cs.ovgu.de: Minimal spannende Bäume. (31.10.2022)
    4. mathe-vital.de: Aufspannende Bäume & Algorithmus von Prim. (31.10.2022)
    Häufig gestellte Fragen zum Thema Prim Algorithmus

    Was ist ein Prim Algorithmus einfach erklärt? 

    Einer der einfachsten Algorithmen zur Lösung des Minimum-Spanning-Tree-Problems ist der Prim-Algorithmus, benannt nach Robert Prim von Bell Labs.

    Was berechnen der Algorithmus von Prim und der Algorithmus von Kruskal? 

    Der Algorithmus von Prim liefert wie der von Kruskal einen minimalen Spannbaum eines ungerichteten Graphen, der einem Greedy-Verfahren entspricht. 

    Erklärung speichern

    Teste dein Wissen mit Multiple-Choice-Karteikarten

    Wahr oder FalschDer Kruskal-Algorithmus verwendet als minimaler Spanning-Tree-Algorithmus eine andere Logik als die von Prim, um die MST eines Graphen zu finden.

    Wahr oder FalschDer Algorithmus von Kruskal folgt einem Greedy-Ansatz und findet bei jedem Schritt die optimale Lösung, indem er sich auf das globale Optimum konzentriert.

    Wahr oder FalschEs gibt zwei bekannte Lösungsideen für das MST-Problem, den Algorithmus von Prim und Dijkstra. 

    Weiter

    Entdecke Lernmaterialien mit der kostenlosen StudySmarter App

    Kostenlos anmelden
    1
    Über StudySmarter

    StudySmarter ist ein weltweit anerkanntes Bildungstechnologie-Unternehmen, das eine ganzheitliche Lernplattform für Schüler und Studenten aller Altersstufen und Bildungsniveaus bietet. Unsere Plattform unterstützt das Lernen in einer breiten Palette von Fächern, einschließlich MINT, Sozialwissenschaften und Sprachen, und hilft den Schülern auch, weltweit verschiedene Tests und Prüfungen wie GCSE, A Level, SAT, ACT, Abitur und mehr erfolgreich zu meistern. Wir bieten eine umfangreiche Bibliothek von Lernmaterialien, einschließlich interaktiver Karteikarten, umfassender Lehrbuchlösungen und detaillierter Erklärungen. Die fortschrittliche Technologie und Werkzeuge, die wir zur Verfügung stellen, helfen Schülern, ihre eigenen Lernmaterialien zu erstellen. Die Inhalte von StudySmarter sind nicht nur von Experten geprüft, sondern werden auch regelmäßig aktualisiert, um Genauigkeit und Relevanz zu gewährleisten.

    Erfahre mehr
    StudySmarter Redaktionsteam

    Team Informatik Lehrer

    • 10 Minuten Lesezeit
    • Geprüft vom StudySmarter Redaktionsteam
    Erklärung speichern Erklärung speichern

    Lerne jederzeit. Lerne überall. Auf allen Geräten.

    Kostenfrei loslegen

    Melde dich an für Notizen & Bearbeitung. 100% for free.

    Schließ dich über 22 Millionen Schülern und Studierenden an und lerne mit unserer StudySmarter App!

    Die erste Lern-App, die wirklich alles bietet, was du brauchst, um deine Prüfungen an einem Ort zu meistern.

    • Karteikarten & Quizze
    • KI-Lernassistent
    • Lernplaner
    • Probeklausuren
    • Intelligente Notizen
    Schließ dich über 22 Millionen Schülern und Studierenden an und lerne mit unserer StudySmarter App!
    Mit E-Mail registrieren