Kann jemand mir bitte erklären, wie man das Worst-Case-Komplexität eines Algorithmus bestimmen kann. Ich weiß, dass wir die Gleichung W (n) = max {t (I) | I Element von D) verwenden müssen, wobei D die Menge der Eingaben der Größe n ist. Errechne ich die Anzahl der Operationen, die für jedes Element I ausgeführt werden, und nehme dann dessen Maximum an? Welchen einfacheren Weg gibt es, dies zu erreichen?Ermittlung der Worst-Case-Komplexität eines Algorithmus
Antwort
aus der Gleichung Ab nach hinten ein wenig zu denken. Was Sie wirklich interessieren, ist die Skalierbarkeit, oder was wird es tun, wenn Sie die Größe der Eingabe erhöhen.
Wenn Sie nur eine Schleife haben, zum Beispiel, haben Sie eine O (n) Zeit Komplexität Algorithmus. Wenn Sie jedoch eine Schleife innerhalb einer anderen Schleife haben, wird sie zu O (n^2), weil sie nun viele Dinge für jede Eingabe der Größe n tun muss.
Wenn Sie über schlimmsten Fall zu sprechen, Sie sprechen in der Regel über nicht deterministische Algorithmen, in dem Sie eine Schleife haben könnten, die vorzeitig stoppen kann. Was Sie dafür tun möchten, ist das Schlimmste anzunehmen und vorzugeben, dass die Schleife so spät wie möglich stoppt. Also, wenn wir haben:
for (int i = 0; i < n; i ++) { für (int j = 0; j < n; j ++) { if (rand()> 0,5) j = n; } }
Wir würden sagen, dass das Worst-Case-O (n^2). Obwohl wir wissen, dass es sehr wahrscheinlich ist, dass die mittlere Schleife früh ausbricht, suchen wir nach der schlechtesten Leistung.
Diese Gleichung ist eher eine Definition als ein Algorithmus.
Hat den Algorithmus in Frage kümmert sich um etwas anderes als die Größe seines Eingangs? Wenn nicht, dann ist die Berechnung von W (n) "einfach".
Ist dies der Fall, versuchen Sie mit einem pathologischen Eingang zu kommen. Zum Beispiel kann es bei Quicksort ziemlich offensichtlich sein, dass eine sortierte Eingabe pathologisch ist, und Sie können etwas zählen, um zu sehen, dass es O (n^2) Schritte benötigt. An diesem Punkt können Sie entweder
- Zeigen Sie, dass Sie Ihre Eingabe ist „maximal“ pathologische
- Exhibit eine passende obere auf der Laufzeit auf jeden Eingang gebunden
Beispiel # 1:
Bei jedem Durchlauf von Quicksort wird der Drehpunkt an die richtige Stelle gesetzt und dann auf die beiden Teile rekursiv gesetzt. (handwave alert) Der schlimmste Fall ist, den Rest des Arrays auf einer Seite des Pivot zu haben. Eine sortierte Eingabe erreicht dies.
Beispiel # 2:
Jeder Durchlauf von quicksort versetzt den Drehpunkt in der richtigen Stelle, so dass es nicht mehr als O (n) hindurchgeht. Jeder Durchgang erfordert nicht mehr als O (n) Arbeit. Daher kann keine Eingabe dazu führen, dass Quicksort mehr als O (n^2) benötigt.
In diesem Fall ist # 2 viel einfacher.
- 1. Ermittlung der Differenz zwischen den Daten
- 2. Ermittlung der am stärksten beanspruchten Sperren?
- 3. Programmatische Ermittlung der Ursache für IOException?
- 4. Vergleich zweier Datensätze zur Ermittlung der Korrelation
- 5. Algorithmus zur Bestimmung der Sommerzeit eines Datums?
- 6. Tuning der Kernel-Parameter eines Algorithmus
- 7. Optimierung eines Algorithmus
- 8. Debugging eines rekursiven Algorithmus
- 9. Optimierung eines Prolog-Algorithmus
- 10. Zeitkomplexität eines rekursiven Algorithmus
- 11. Ermittlung der Zeit, die Prozesse verbringen Blockieren/Ausführen
- 12. Ermittlung der Anzahl der Prozessoren für die Verwendung von Openmpi
- 13. Ermittlung der Anzahl der Parameter in einem Lambda
- 14. Ermittlung der Implementierung der Methode basierend auf verfügbaren Einschränkungen
- 15. Automatische Ermittlung des Kreditkarten-Typs
- 16. Solidität und Vollständigkeit eines Algorithmus
- 17. Algorithmus zum "Überfluten" eines Bereichs
- 18. Hilfe zum Schreiben eines Algorithmus
- 19. Zeitkomplexität eines Algorithmus (Nested Loops)
- 20. Hilfe zum Erzwingen eines Algorithmus
- 21. Ermittlung der Minima, Index außerhalb des Bereichs Fehler
- 22. Ermittlung der Entfernung zwischen zwei Postleitzahlen (Alternativen zu mapdist)
- 23. Ermittlung des Anwendungsproblems, Datenbankproblems oder Hardwareproblems?
- 24. Ermittlung vorhandener Webhook-IDs auf Trello
- 25. Blockchain-API zur Ermittlung von Transaktionsbestätigungen
- 26. rekursive Algorithmus, der jedes Paar eines Satzes kehrt
- 27. Algorithmus für die Berechnung der Umkehrung eines Polynoms
- 28. Nicht in der Lage, die Komplexität eines Algorithmus zusammenzufassen
- 29. Ermittlung des Firmennamens von IP-Adresse
- 30. Algorithmus zum Auffinden von Symmetrien eines Baumes
Nur eine Warnung über Nicht-Determinismus. Eine früh terminierende Schleife ist nicht nicht deterministisch ... Determinismus bedeutet, dass man definitiv weiß, was ein Programm tun würde, und nicht in der Lage zu bestimmen, was es tun wird. Ein probabilistischer oder randomisierter Algorithmus wäre nicht deterministisch, weil es einen Schritt im Algorithmus gibt, bei dem Sie nicht wissen, was passieren wird (ich spreche nicht von Zufallszahlen - sondern von randomisierten Algorithmen). http://en.wikipedia.org/wiki/Non-deterministic_algorithm – Kekoa
Es gibt eine klare Unterscheidung und eine enge Verbindung zwischen Nicht-Determinismus und Zufälligkeit. In Bezug auf Turin Machines denken wir von randomisierten Algorithmen, dass sie Zugang zu einem (unendlichen) Band von Zufallszahlen haben. Wenn Sie fixieren, was auf dem zufälligen Band ist (Ihr zufälliger Startwert), ist der Rest deterministisch. Nicht-deterministische Turing-Maschinen können jedoch bei festem Eingang von einem Zustand zu mehreren anderen wechseln. –