Die Schönheit von Datenstrukturen und Algorithmen (Zeitkomplexitätsanalyse)

Inhalt

Die Schönheit von Datenstrukturen und Algorithmen (Zeitkomplexitätsanalyse)

1. Was ist Komplexitätsanalyse?

2. Warum Komplexitätsanalyse?

3. Wie man die Zeitkomplexitätsanalyse analysiert

4. Häufig verwendete Komplexitätsstufen

5. Wie man die Komplexitätsanalyse meistert

6. 4 Konzepte der Komplexität


Die Schönheit von Datenstrukturen und Algorithmen (Zeitkomplexitätsanalyse)

Vorwort:

Datenstrukturen und Algorithmen selbst lösen das Problem von „schnell“ und „sparend“ , das heißt, wie man den Code schneller laufen lässt und wie man den Code dazu bringt, mehr Speicherplatz zu sparen. Daher ist die Ausführungseffizienz eine sehr wichtige Überlegung des Algorithmus.

Der heutige Inhalt dreht sich hauptsächlich um: Zeitkomplexität und Raumkomplexität ( über Raumkomplexität gibt es nichts zu sagen , schauen Sie sich nur den eröffneten Raum an) 

1. Was ist Komplexitätsanalyse?


1. Das Lösen von Datenstrukturen und Algorithmen ist "wie man Computer dazu bringt, Probleme schneller und auf weniger Platz zu lösen".
2. Daher ist es notwendig, die Leistungsfähigkeit von Datenstrukturen und Algorithmen aus den beiden Dimensionen Ausführungszeit und Footprint zu bewerten.
3. Die beiden Konzepte Zeitkomplexität und Raumkomplexität werden verwendet, um das Leistungsproblem zu beschreiben, und die beiden werden gemeinsam als Komplexität bezeichnet.
4. Komplexität beschreibt die Wachstumsbeziehung zwischen der Ausführungszeit des Algorithmus (oder dem belegten Speicherplatz) und der Datengröße.


2. Warum Komplexitätsanalyse?


1. Im Vergleich zu Leistungstests weist die Komplexitätsanalyse die Merkmale einer unabhängigen Ausführungsumgebung, niedriger Kosten, hoher Effizienz, einfacher Bedienung und starker Anleitung auf.
2. Die Beherrschung der Komplexitätsanalyse wird in der Lage sein, Code mit besserer Leistung zu schreiben, was dazu beiträgt, Systementwicklungs- und Wartungskosten zu senken.

Große O-Notation (finden wir es selbst heraus) https://baike.baidu.com/item/%E5%A4%A7O%E8%A1%A8%E7%A4%BA%E6%B3%95/1851162

Was es macht:

Um es ganz klar zu sagen, es soll Ihnen eine ungefähre Vorstellung von der Laufzeit oder dem benötigten Speicherplatz des Algorithmus (dieses Codes) geben (kennen Sie einfach seine Größe).

3. Wie man die Zeitkomplexitätsanalyse analysiert

1) Die Häufigkeit von Single-Segment-Codes ist hoch

Sehen Sie sich die Codezeilen mit der höchsten Ausführungshäufigkeit an (z. B. While, For-Schleife) [ konzentrieren Sie sich auf den Codeabschnitt mit den meisten Schleifenausführungszeiten ]

2) Multi-Segment-Code, um den größten zu nehmen

Was ist die größte, das heißt, es kann mehrere Schleifen oder einzelne Schleifen in einem Codestück geben, dann sehen Sie, welche größer ist (mehrere Schleifen).

Der Unterschied zwischen den folgenden 4 bedeutet, dass der vierte Punkt derselben Variablen    eine andere Variable ist, sodass die Additionsregel verwendet wird

3) Verschachtelter Code nimmt Produkt (Multiplikationsregel)

void  text(int n,int m) {
int i,j;
for(i=0;i<n;i++)
    for(j=0;j<m;j++)
       {
          //待执行的代码
        }
 }

Die Zeitkomplexität des aktuellen Codes ist O(n*m)

4) Addiere mehrere Skalen und bilde die Summe der beiden (Additionsregel)

void  text(int m, int n) {
  int sum1 = 0;
  for ( int i = 1; i < m; ++i) {
    sum1 = sum1 + i;
  }

  int sum2 = 0;
  for (int j = 1; j < n; ++j) {
    sum2 = sum2 + j;
  }

}

Die Methode hat zwei Parameter, um die Anzahl von zwei Schleifen zu steuern, dann wird die Komplexität der beiden hinzugefügt. O(m+n)

4. Häufig verwendete Komplexitätsstufen

Diese komplexen Maße oben können in zwei Teile unterteilt werden:   polynomial und nicht-polynomial

 Polynomgröße:

O(1) (konstante Ordnung), O(logn) (logarithmische Ordnung), O(n) (lineare Ordnung), O(nlogn) (lineare logarithmische Ordnung), O(n^2) (quadratische Ordnung), O( n^3) (kubische Ordnung)

Nichtpolynomische Größe:

O(2^n) (exponentielle Ordnung), O(n!) (faktorielle Ordnung)

Das ist hier erwähnenswert

Polynomische Ordnung: Mit zunehmender Datengröße steigen die Ausführungszeit und der vom Algorithmus belegte Speicherplatz proportional zum Polynom.

Nicht-Polynom-Ordnung: Wenn die Größe der Daten zunimmt, nehmen die Ausführungszeit und die Platzbelegung des Algorithmus stark zu , und die Leistung dieser Art von Algorithmus ist extrem schlecht .

5. Wie man die Komplexitätsanalyse meistert

Hier kommt der Unsinn (übe mehr und du wirst fertig)

6. 4 Konzepte der Komplexität

1) Zeitkomplexität im günstigsten Fall

Die Zeitkomplexität des Codes, der im besten Fall ausgeführt wird.
 

2) Zeitkomplexität im ungünstigsten Fall

Die zeitliche Komplexität des Codes im ungünstigsten Fall.

3) Durchschnittliche Fallzeitkomplexität

Ausgedrückt als gewichteter Durchschnitt der Häufigkeit, mit der der Code in allen Fällen ausgeführt wurde.

4) Amortisierte Fallzeitkomplexität

Die meisten aller Komplexitätsfälle der Codeausführung sind Low-Level-Komplexität, und Einzelfälle sind High-Level-Komplexität, und wenn es einen zeitlichen Zusammenhang gibt, kann individuelle High-Level-Komplexität auf Low-Level-Komplexität amortisiert werden. Grundsätzlich entspricht das amortisierte Ergebnis einer geringen Komplexität.

 // array表示一个长度为n的数组
 // 代码中的array.length就等于n
 int[] array = new int[n];
 int count = 0;
 
 void insert(int val) {
    if (count == array.length) {
       int sum = 0;
       for (int i = 0; i < array.length; ++i) {
          sum = sum + array[i];
       }
       array[0] = sum;
       count = 1;
    }

    array[count] = val;
    ++count;
 }

Beispiel:

Auf jeden O(n)-Einfügevorgang folgen n-1 O(1)-Einfügevorgänge, sodass sich der zeitaufwändigere Vorgang gleichmäßig auf die nächsten n-1 weniger zeitaufwendigen Vorgänge amortisiert diese Gruppe aufeinanderfolgender Operationen ist O(1).

Nachdem Sie über diese vier Konzepte gesprochen haben, fragen sich einige Leute vielleicht, warum diese vier Konzepte hinzugefügt wurden.

Dies liegt daran, dass derselbe Codeabschnitt bei unterschiedlichen Eingaben unterschiedliche Komplexitätsgrade aufweisen kann. Die vier Konzepte dienen dazu, die entsprechende Zeitkomplexität genauer zu beschreiben.

Das Wichtigste ist, wie wir analysieren:

Vom Besten und Schlechtesten ganz zu schweigen.

Durchschnittliche Fallzeitkomplexität:

Der Größenordnungsunterschied in der Komplexität des Codes in verschiedenen Situationen wird durch den gewichteten Durchschnitt der Ausführungszeiten des Codes in allen möglichen Situationen dargestellt.

Amortisierte Fallzeitkomplexität:

In einer Reihe kontinuierlicher Operationen an einer Datenstruktur ist die zeitliche Komplexität in den meisten Fällen sehr gering und die zeitliche Komplexität nur in einigen Fällen relativ hoch, und es besteht eine kohärente zeitliche Beziehung zwischen diesen Operationen Analysieren Sie diese Gruppe von Operationen gemeinsam, um zu sehen, ob der Zeitaufwand der Operation mit höherer Zeitkomplexität auf andere Operationen mit geringerer Zeitkomplexität amortisiert werden kann. Darüber hinaus ist dort, wo eine Analyse der amortisierten Zeitkomplexität angewendet werden kann, die amortisierte Zeitkomplexität im Allgemeinen gleich der Zeitkomplexität im besten Fall.

Supongo que te gusta

Origin blog.csdn.net/qq_54729417/article/details/122844630
Recomendado
Clasificación