Formale Grundlagen der Wirtschaftsinformatik Nikolaj Popov Research Institute for Symbolic Computation [email protected] Komplexität Komplexität • Die Komplexität eines Algorithmus ist die Abschätzung des Aufwandes seiner Realisierung bzw. Berechnung auf einem Computer. • Komplexität wird daher auch rechnerische Komplexität (computational complexity) genannt. Komplexität • Die algorithmische Komplexität eines Problems ist also die "Geschwindigkeit" die ein optimaler Algorithmus für dieses Problem im schlechtesten Fall (worst case) benötigt. Komplexität • Beispiel: Komplexität • Die Effizienz eines Algorithmus ist seine Sparsamkeit bezüglich der Ressourcen wie Rechenzeit und Speicherplatz, die er zur Lösung eines festgelegten Problems braucht. • Dabei geht es einerseits darum für ein konkretes Problem ein effizientes Verfahren anzugeben und dann den Rechenaufwand zu analysieren. Komplexität • Dadurch erhält man sowohl einen Algorithmus zur Lösung des Problems als auch eine obere Schranke für die Komplexität des Problems. • Es kann aber auch ein Berechnungsverfahren geben, das schneller als der gefundene Algorithmus ist. Komplexität • Man kann auch umgekehrt versuchen eine untere Schranke für die Komplexität eines Problems zu finden. • Eine triviale untere Schranke für ein Problem mit Eingabe der Grösse n ist n, da zumindest die Eingabe gelesen werden muss. Komplexität • Definition: Es seien f, g: ℕ→ ℝ+ Funktionen. • Es gilt f(n) = O(g(n)), wenn eine reelle Zahl c > 0 und n0 ∈ ℕ existieren, sodass für alle natürlichen Zahlen n ≥ n0 gilt f (n) ≤ c . g(n) Komplexität • Definition: Es seien f, g: ℕ→ ℝ+ Funktionen. • Es gilt f(n) = (g(n)), wenn eine reelle Zahl c > 0 und n0 ∈ ℕ existieren, sodass für alle natürlichen Zahlen n ≥ n0 gilt f (n) ≥ c . g(n) Komplexität • Die O-Notation erlaubt es, Algorithmen auf einer höheren Abstraktionsebene miteinander zu vergleichen. • Algorithmen können mit Hilfe der O-Notation unabhängig von Implementierungsdetails, wie Programmiersprache, Compiler und HardwareEigenschaften, verglichen werden. Komplexität • Beispiel: T(n) = O(g(n)), wenn es c und n0 gibt, so dass T (n) ≤ c . g(n) für alle n ≥ n0 . Komplexität • Beispiel: für T(n) = n2 +2n gilt T(n) = O(n2). • Begründung: Sei c=3 und n0=1 2n + n2 ≤ 3n2 2n + n2 ≤ 2n2 + n2 2n ≤ 2n2 1≤ n Komplexität • Beispiel: für T(n) = n2 +2n gilt T(n) = O(n2). • Die Funktion T(n) liegt in der Komplexitätsklasse O(n2). • Die Größenordnung der Funktion T(n) ist O(n2). Komplexität • Die O-Notation betont die dominante Größe • Beispiel: 5n3 + 55n2 +66n +33 = O(n3). • Die Funktion T(n) liegt in der Komplexitätsklasse O(n2). • Die Größenordnung der Funktion T(n) ist O(n2). Komplexitätsklassen Komplexitätsklassen • Ein zentrales Thema der Komplexitätstheorie ist die Stärke verschiedener Maschinenmodelle. • Wir unterscheiden im wesentlichen die zwei Klassen P und NP: • P = Klasse aller Probleme, die durch deterministische Algorithmen in polynomieller Zeit lösbar sind. Komplexitätsklassen • NP = Klasse aller Probleme, die durch nichtdeterministische Algorithmen in polynomieller Zeit lösbar sind. • Jeder deterministische Algorithmus ist auch nichtdeterministisch, daher gilt P ⊆ NP. Komplexitätsklassen • Ein nichtdeterministischer Algorithmus für ein Problem aus NP kann mit Hilfe eines deterministischen Algorithmus mit exponentiellem Zeitbedarf simuliert werden. • Offensichtlich P ⊆ NP gilt. Bis jetzt ist nicht bekannt, ob P = NP gilt. Komplexitätsklassen • Diese Frage wird das P–NP Problem genannt. • Für viele Probleme ist bekannt, dass sie in NP liegen, aber man kennt keine (deterministisch) polynomiellen Algorithmen zur Lösung dieser Probleme. Komplexitätsklassen • Definition: Seien L1 und L2 Sprachen. • Dann heisst L1 auf L2 polynomiell reduzierbar, falls es eine totale, mit polynomieller Komplexität berechenbare Funktion f gibt sodass für alle x gilt x ∈ L1 ⇔ in Zeichen L1 ≤ p L2 f(x) ∈ L2 Komplexitätsklassen • Falls L1 auf L2 polynomiell reduzierbar ist, dann liegt L1 zumindest in der gleichen Klasse wie L2. • Lemma: Falls L1 ≤ p L2 und L2 ∈ P (bzw. L2 ∈ NP), dann ist auch L1 ∈ P (bzw. L1 ∈ NP) Komplexitätsklassen • Definition: Eine Sprache A heisst NP-hart, falls für alle Sprachen L ∈ NP gilt: L ≤ p A . • Definition: Eine Sprache A heisst NP-vollständig, falls A NP-hart ist und A ∈ NP gilt. Komplexitätsklassen • F: Wann ist ein Problem in P? • A: Wenn es eine deterministische TM gibt, die das Problem in Polynomialzeit entscheidet. • D.h. es gibt ein Polynom p, so dass bei Eingabe w mit |w| = n die TM maximal p(n) Schritte macht und dann entscheidet, ob w in der Sprache ist oder nicht. Komplexitätsklassen • F: Wann ist ein Problem in NP? • A: Wenn es eine nichtdeterm. TM gibt, die das Problem in Polynomialzeit entscheidet. Man beachte, dass dafür nur verlangt wird, dass die kürzeste Erfolgsrechnung innerhalb der Zeitschranke ist. Komplexitätsklassen • F: Wann ist ein Problem NP-schwierig? • A: Wenn sich jedes Problem r, das in NP liegt, in deterministisch polynomieller Zeit auf p reduzieren lässt. Komplexitätsklassen • F: Wann ist ein Problem NP-vollständig? • A: Wenn es NP-schwierig ist und zusätzlich noch selbst in NP liegt. Komplexitätsklassen • F: Was müssen wir machen, wenn wir ein Problem als NP-vollständig nachweisen wollen? • A: Zeigen, dass es in NP ist und zeigen, dass jedes Problem aus NP sich auf dieses Problem in Polynomialzeit reduzieren lässt. Komplexitätsklassen • F: Was wissen wir, wenn ein Problem NP-vollständig ist? • A: Wir wissen dann, dass es aller Wahrscheinlichkeit nach nicht in P liegt.