Komplexität (Informatik) - de.LinkFang.org

Komplexität (Informatik)





Komplexität bezeichnet in der Informatik die „Kompliziertheit“ von Problemen, Algorithmen oder Daten. Die Komplexitätstheorie befasst sich dabei mit dem Ressourcenverbrauch von Algorithmen, die Informationstheorie dagegen verwendet den Begriff für den Informationsgehalt von Daten (siehe unten).

Inhaltsverzeichnis

Komplexität von Algorithmen


Unter der Komplexität (auch Aufwand oder Kosten) eines Algorithmus (nicht zu verwechseln mit der Algorithmischen Komplexität, siehe unten) versteht man in der Komplexitätstheorie seinen maximalen Ressourcenbedarf. Dieser wird oft in Abhängigkeit von der Länge \({\displaystyle n}\) der Eingabe angegeben und für große \({\displaystyle n}\) asymptotisch unter Verwendung eines Landau-Symbols abgeschätzt. Analog wird die Komplexität eines Problems definiert durch den Ressourcenverbrauch eines optimalen Algorithmus zur Lösung dieses Problems. Die Schwierigkeit liegt darin, dass man somit alle Algorithmen für ein Problem betrachten müsste, um die Komplexität desselben zu bestimmen.

Die betrachteten Ressourcen sind fast immer die Anzahl der benötigten Rechenschritte (Zeitkomplexität) oder der Speicherbedarf (Platzkomplexität). Die Komplexität kann aber auch bezüglich einer anderen Ressource bestimmt werden. Dabei interessiert nicht der Aufwand eines konkreten Programms auf einem bestimmten Computer, sondern viel mehr, wie der Ressourcenbedarf wächst, wenn mehr Daten zu verarbeiten sind, also z. B. ob sich der Aufwand für die doppelte Datenmenge verdoppelt oder quadriert (Skalierbarkeit).

Oft ist es sehr aufwändig oder ganz unmöglich, eine Funktion anzugeben, die allgemein zu jeder beliebigen Eingabe für ein Problem den zugehörigen Aufwand an Ressourcen angibt. Daher begnügt man sich in der Regel damit, statt jede Eingabe einzeln zu erfassen, sich lediglich mit der Eingabelänge \({\displaystyle n=|w|}\) zu befassen. Es ist aber meist sogar zu schwierig, eine Funktion \({\displaystyle f_{L}\colon n\rightarrow f_{L}(n),n=|w|}\) anzugeben. Daher beschränkt man sich häufig darauf, eine obere und untere Schranke für das asymptotische Verhalten anzugeben. Hierfür wurden die Landau-Symbole entwickelt.

Algorithmen und Probleme werden in der Komplexitätstheorie gemäß ihrer so bestimmten Komplexität in so genannte Komplexitätsklassen eingeteilt. Diese sind ein wichtiges Werkzeug, um bestimmen zu können, welche Probleme „gleich schwierig“, beziehungsweise welche Algorithmen „gleich mächtig“ sind. Dabei ist die Frage, ob zwei Komplexitätsklassen gleichwertig sind, oft nicht einfach zu entscheiden (zum Beispiel P-NP-Problem).

Die Komplexität eines Problems ist zum Beispiel entscheidend für die Kryptographie und insbesondere für die asymmetrische Verschlüsselung: So verlässt sich zum Beispiel das RSA-Verfahren auf die Vermutung, dass die Primfaktorzerlegung von großen Zahlen nur mit sehr viel Aufwand zu berechnen ist – anderenfalls ließe sich aus dem öffentlichen Schlüssel leicht der private Schlüssel errechnen.

Ein Problem, das selbst für einen Computer von der Größe der Erde nicht lösbar ist, wird als transcomputationales Problem bezeichnet.

Komplexität von Daten


In der Informationstheorie versteht man unter der Komplexität von Daten bzw. einer Nachricht ihren Informationsgehalt. Neben der klassischen Definition dieser Größe nach Claude Shannon gibt es verschiedene andere Ansätze, zu bestimmen, wie viel Information in einer Datenmenge enthalten ist:

Zum einen gibt es die so genannte Kolmogorow-Komplexität (auch Algorithmische Komplexität oder Beschreibungskomplexität), die den Informationsgehalt als die Größe des kleinsten Programms definiert, das in der Lage ist, die betrachteten Daten zu erzeugen. Sie beschreibt eine absolut optimale Komprimierung der Daten. Eine Präzisierung des Ansatzes Andrei Kolmogorows bezüglich des Maschinenmodells bietet die Algorithmische Informationstheorie von Gregory Chaitin.

Dagegen betrachtet Algorithmische Tiefe (auch Logische Tiefe) die Zeitkomplexität eines optimalen Algorithmus zur Erzeugung der Daten als Maß für den Informationsgehalt.

Komplexitätsmetriken


Es gibt eine Reihe von Softwaremetriken, welche die Komplexität von Daten und Algorithmen in der Informatik auf unterschiedliche Art und Weise messen. Diese sind:

Chapins Data-Metrik
Misst den Anteil der Bedingungs- und Ergebnisdaten an allen verwendeten Daten.
Elshofs Data-Flow-Metrik
Misst die Anzahl der Datenverwendungen relativ zur Anzahl der Daten. Sie ist verwandt mit hoher Kohäsion. Hohe Kohäsion entspricht einer häufigen Verwendung von möglichst wenig Variablen.
Cards Data-Access-Metrik
Misst das Verhältnis der Anzahl der Zugriffe auf externe Dateien und Datenbanken relativ zur Anzahl derselben.
Henrys Interface-Metrik
Misst die Anzahl der Zugriffe von fremden Funktionen/Methoden in ein Modul (englisch fan-in) beziehungsweise Anzahl der Aufrufe fremder Funktionen/Methoden aus einem Modul (englisch fan-out) relativ zu allen Funktionen/Methoden des Moduls.
McCabe-Metrik bzw. Eulers Maß bzw. Zyklomatische Komplexität
Misst die Komplexität des Ablaufgraphen als Verhältnis der Kantenanzahl zur Knotenanzahl.
McClures Decision-Metrik
Misst den Anteil der Entscheidungen an allen Anweisungen.
Sneeds Branching-Metrik
Misst das Verhältnis der Anzahl Verzweigungen jeglicher Art zur Summe aller Anweisungen.
Halstead-Metrik
Misst die Anzahl der verschiedenen Wörter (hier Anweisungstypen) relativ zur Anzahl verwendeter Wörter (hier Anweisungen). Sie behauptet, je weniger verschiedene Anweisungstypen man verwendet, desto einfacher ist der Code, was sehr umstritten ist.
NPATH
Zählt die azyklischen Pfade durch Funktionen[1]
Cognitive Complexity
Wird von SonarQube zur Messung der Komplexität von Programmen und Programmteilen gegenüber anderen Komplexitätsmetriken empfohlen.[2]

Siehe auch


Einzelnachweise


  1. Brian A. Nejmeh: NPATH: a measure of execution path complexity and its applications. In: Communications of the ACM. Band 31, Nr. 2, Februar 1988, doi:10.1145/42372.42379 .
  2. G. Ann Campbell: Cognitive Complexity. A new way of measuring understandability. Hrsg.: SonarSource. 2016 (englisch, 20 S., sonarsource.com [PDF; 214 kB; abgerufen am 10. März 2020]).








Kategorien: Komplexitätstheorie








Quelle: Wikipedia - https://de.wikipedia.org/wiki/Komplexität (Informatik) (Autoren [Versionsgeschichte])    Lizenz: CC-by-sa-3.0

Veränderungen: Alle Bilder und die meisten Designelemente, die mit ihnen in Verbindung stehen, wurden entfernt. Icons wurden teilweise durch FontAwesome-Icons ersetzt. Einige Vorlagen wurden entfernt (wie „Lesenswerter Artikel“, „Exzellenter Artikel“) oder umgeschrieben. CSS-Klassen wurden zum Großteil entfernt oder vereinheitlicht.
Wikipedia spezifische Links, die nicht zu Artikeln oder Kategorien führen (wie „Redlink“, „Bearbeiten-Links“, „Portal-Links“) wurden entfernt. Alle externen Links haben ein zusätzliches FontAwesome Icon erhalten. Neben weiteren kleinen Designanpassungen wurden Media-Container, Karten, Navigationsboxen, gesprochene Versionen & Geo-Mikroformate entfernt.


Stand der Informationen: 02.07.2020 07:08:49 CEST - Wichtiger Hinweis Da die gegebenen Inhalte zum angegebenen Zeitpunkt maschinell von Wikipedia übernommen wurden, war und ist eine manuelle Überprüfung nicht möglich. Somit garantiert LinkFang.org nicht die Richtigkeit und Aktualität der übernommenen Inhalte. Sollten die Informationen mittlerweile fehlerhaft sein oder Fehler in der Darstellung vorliegen, bitten wir Sie darum uns per zu kontaktieren: E-Mail.
Beachten Sie auch : Impressum & Datenschutzerklärung.