Die Zyklomatische Komplexität des BubbleSort-Algorithmus

https://oer-informatik.de/zyklomatische-komplexitaet-bubblesort

tl/dr; (ca. 3 min Lesezeit): Für Bubblesort wird auf vier verschiedene Arten die zyklomatische Komplexität bestimmt. Hintergründe zur Zyklomatischen Komplexität finden sich in diesem Artikel.

Am Beispiel des Bubblesort-Algorithmus soll die Zyklomatische Komplexität dargestellt werden.

Der Algorithmus lässt sich in einem Java-Programm etwa so umsetzen:

Entwicklung des Kontrollfluss-Graphen

Zur Berechnung der Zyklomatischen Komplexität wird die Anzahl der Knoten und Kanten benötigt. Aufgepasst werden muss insbesondere bei den zählergesteuerten Schleifen (for(...)), da sich hier drei Statements verstecken, die zu unterschiedlichen Zeitpunkten im Kontrollfluss ausgeführt werden: Die Initialisierung (int i=1) zu Beginn des Eintritts in die Schleife, die Inkrementierung (i++) am Ende jedes Durchlaufs und der Vergleich (i<mein_array.length) vor jedem Durchlauf.

Herleitung über Knoten und Kanten aus dem UML-Aktivitätsdiagramm

Der Kontrollfluss lässt sich aus dem UML-Aktivitätsdiagramm herleiten. Für Bubblesort sieht das Aktivitätsdiagramm folgendermaßen aus:

Das UML-Aktivitätsdiagramm des Algorithmus
Das UML-Aktivitätsdiagramm des Algorithmus

Das Aktivitätsdiagramm stellt eine besondere Art des Kontrollflussgraphen dar - wir zählen hier 13 Knoten (Aktivitäten und Entscheidungsknoten, Start und Ende nicht eingerechnet) sowie 15 Kanten (ohne die Kanten an Start und Stop). Bereits daraus lässt sich die Zyklomatische Komplexität errechnen:

M = e - n + 2 = 15 - 13 + 2 = 4

Herleitung über Knoten und Kanten des Kontrollflusses von Bubblesort

Wenn wir aus dem Aktivitätsdiagramm alle Sequenzen (unverzweigte aufeinanderfolgende Operationen) und die Entscheidungsknoten mit den vorigen Knoten zusammenfassen, erhalten wir einen einfachen Kontrollflussgraphen:

Als Aktivitätsdiagramm hier
Als Aktivitätsdiagramm hier

Durch die Vereinfachungen variieren die Anzahl der Knoten und Kanten, aber das Ergebnis bleibt:

M = e - n + 2 = 9 - 7 + 2 = 4

Herleitung über die binären Verzweigungen von Bubblesort

Der Kontrollfluss weist 3 binäre Verzweigungen auf: die Knoten (3), (4) und (5). Die alternativen Zweige sind oben jeweils farblich hervorgehoben. Auch mit dieser Berechnung können wir die _Zyklomatische Komplexität bestimmen.

M = b + 1 = 3 + 1 = 4

Herleitung über die linear unabhängigen Pfade von Bubblesort

Alternativ ließen sich schließlich noch die linear unabhängigen Pfade bestimmen. Die Pfade werden jeweils durchlaufen, bis ein Knoten erreicht wird, der in dem jeweiligen Pfad bereits erreicht wurde.

Pfad 1: Start->1->2->7->Stop

`Start->1->2->7->Stop
`Start->1->2->7->Stop

Pfad 2: Start->1->2->3->4-> (wiederholt 2)

Start->1->2->3->4
Start->1->2->3->4

Pfad 3: Start->1->2->3->4->5-> (wiederholt 4)

Start->1->2->3->4->5
Start->1->2->3->4->5

Pfad 4: Start->1->2->3->4->5->6-> (wiederholt 4)

Start->1->2->3->4->5->6
Start->1->2->3->4->5->6

Wie erwartet finden sich vier linear unabhängige Pfade. Es wird aber bereits deutlich, dass dieser Weg bei komplexeren Methoden der am wenigsten geeignete ist, um die Zyklomatische Komplexität zu bestimmen.

Herleitung aus dem Quelltext

Auch direkt aus dem Quelltext lassen sich Knoten und Kanten ermitteln. Hilfreich ist es, hierbei mit Farben und Markierungen für die bedingten Anweisungen zu arbeiten:

Quelltext mit Verweisen auf den daraus entwickelten Kontrollfluss-Graphen
Quelltext mit Verweisen auf den daraus entwickelten Kontrollfluss-Graphen

Es ergeben sich aus dem so ermittelten Kontrollflussgraphen 7 Knoten und 9 Kanten (exklusive Start- und Endknoten).

M = e - n + 2 = 9 - 7 + 2 = 4

Fazit

Das eingängigste Verfahren zur Bestimmung der Zyklomatischen Komplexität ist die Bestimmung der binären Verzweigungen. Lediglich bei Verzweigungen mit mehreren Alternativen (z.B. switch/case-Konstrukte) kann das Umwandeln in binäre Verzweigungen fehlerträchtig sein.

Quellen und offene Ressourcen (OER)

Die Ursprungstexte (als Markdown), Grafiken und zugrunde liegende Diagrammquelltexte finden sich (soweit möglich in weiterbearbeitbarer Form) in folgendem git-Repository:

https://gitlab.com/oer-informatik/algorithmik/pseudocode.

Sofern nicht explizit anderweitig angegeben sind sie zur Nutzung als Open Education Resource (OER) unter Namensnennung (H. Stein, oer-informatik.de) freigegeben gemäß der Creative Commons Namensnennung 4.0 International Lizenz (CC BY 4.0).

Creative Commons Lizenzvertrag

Kommentare gerne per Mastodon, Verbesserungsvorschläge per gitlab issue (siehe oben). Beitrag teilen: