Wie lange dauert es, 10610610^6 Zahlen und 10910910^9 Zahlen für zwei Algorithmen zu sortieren, wenn sie die gleiche Zeit brauchen, um 100010001000 Zahlen zu sortieren?

Frage Wir haben zwei Sortieralgorithmen. Die Laufzeit von Algorithm 1 Ist Ö ( N 2 ) während Algorithmus 2 Laufzeit hat Ö ( N l Ö G ( N ) ) . Nehmen Sie diesen Algorithmus an 1 und Algorithmus 2 nehmen 1 zweitens zu sortieren 1000 Zahlen. Wie lange würde es dauern, bis jeder Algorithmus a) aussortiert? 10 6 Zahlen b) 10 9 Zahlen?

Kommentare Mir ist klar, dass dies eine einfache Frage sein mag, aber ich fange gerade erst mit diesem Material an. Für einen Hinweis oder eine vollständige Antwort wäre ich dankbar.

Antworten (3)

Wie es heißt, lautet die Antwort "wir wissen es nicht". Es folgt aus der Ö ( ) Notation - grob gesagt, Sie haben nicht genug Informationen, um auf irgendetwas zu schließen. Sie kennen nur das asymptotische Verhalten und nicht einmal die Konstanten.

Algorithmus 1 könnte genauso schnell sein wie Algorithmus 2 solange N ist kleiner als, sagen wir, 10 10 , und bricht dann zusammen.

Schlimmer noch, die Big-Oh-Notation ist nur eine Obergrenze. Soweit wir wissen, könnten beide die gleiche Laufzeit haben Ö ( N Protokoll N ) , da wenn Algorithmus 1 Laufzeit hätte Ö ( N Protokoll N ) , es hätte trivialerweise auch Laufzeit Ö ( N 2 ) .

Sie haben zwei Antworten gesehen, die veranschaulichen, dass Big-O-Timing-Schätzungen nicht viel über die tatsächlichen Laufzeiten aussagen, aber um zu veranschaulichen, wie groß der Unterschied zwischen den tatsächlichen Bestellungen ist, lassen Sie uns auf die Big-O-Schätzungen verzichten und annehmen, dass wir es tatsächlich wüssten dass Algorithmus 1 genau genommen hat C 1 N 2 Sekunden zu sortieren N Zahlen und Algorithmus 2 nahm genau C 2 N Protokoll 10 N Sekunden zu sortieren N Zahlen (ich habe log zur Basis zehn gewählt, um die Berechnungen zu vereinfachen; die Wahl einer anderen Basis würde nur die Konstante ändern C 2 ).

Wenn Algorithmus 2 zum Sortieren 1 Sekunde brauchte 10 3 Zahlen, hätten wir

1 = C 1 ( 10 3 ) 2 = C 1 10 6
So C 1 = 1 / 10 6 . Wenn Algorithmus 2 auch 1 Sekunde zum Sortieren brauchte 10 3 Zahlen, hätten wir
1 = C 2 ( 10 3 Protokoll ( 10 3 ) ) = C 2 ( 3 10 3 )
So C 2 = 1 / ( 3 10 3 ) .

Nun wollen wir sehen, was passiert, wenn wir sortieren 10 6 Zahlen. Algorithmus 1 übernimmt

1 10 6 ( 10 6 ) 2 = 10 12 10 6 = 10 6  Sekunden
was ungefähr funktioniert 11.5 Tage. Andererseits übernimmt Algorithmus 2
1 3 10 3 ( 10 6 Protokoll 10 6 ) = 6 10 6 3 10 3 = 2 10 3  Sekunden
worum es geht 33.3 Protokoll. Hmm, 11 Tage statt einer halben Stunde. Ich weiß, welchen Algorithmus ich verwenden würde.

Bei größeren Eingaben wird der Zeitunterschied sogar noch dramatischer. Mit 10 9 Zahlen zu sortieren, können Sie ausrechnen, dass Algorithmus 1 ungefähr 31688 Jahre brauchen würde , während Algorithmus 2 ungefähr 34,7 Tage brauchen würde.

Beachten Sie, dass Algorithmus 1 einen viel kleineren konstanten Multiplikator als Algorithmus 2 hatte, aber auf lange Sicht war das nicht annähernd so wichtig wie die asymptotische Reihenfolge ihrer Laufzeiten. Einfach gesagt, ein N Protokoll N Algorithmus wird schließlich ein schlagen N 2 Algorithmus, egal wie das konstante Vielfache ist.

Mathematisch, groß- Ö Notation funktioniert so nicht. Ö ( N 2 ) bezeichnet eine Äquivalenzklasse von Funktionen basierend auf ihrer Asmyptotik.

Also zum Beispiel F definiert von F ( N ) = N 2 gehört Ö ( N 2 ) . Ebenso die Funktion G definiert von G ( N ) = 10 1000 N 2 .

Also zwei verschiedene Algorithmen, die Zeit brauchen Ö ( N 2 ) kann für eine bestimmte Aufgabe immer noch eine sehr unterschiedliche Leistung haben. Der große- Ö Notation soll die Skalierbarkeit dieser Algorithmen als erfassen N .


Wenn Sie dies jedoch für eine praktische Anwendung verwenden, wird die multiplikative Konstante vorne wahrscheinlich nicht zu groß sein. Ignorieren der Ö ( . . ) kann oft eine vernünftige Intuition geben, wie lange der Algorithmus dauern wird.

Wir könnten uns also annähern, dass die Ö ( N 2 ) Der Algorithmus würde einige Zeit in Anspruch nehmen ( 10 6 ) 2 = 10 12 herstellen 10 6 Gegenstände und die Ö ( N Protokoll N ) Der Algorithmus würde einige Zeit in Anspruch nehmen 10 9 Protokoll 10 9 2 × 10 10 herstellen 10 9 Artikel.

In den meisten realen Fällen wird der Vergleich nicht allzu schlecht sein, aber andererseits könnte er auch schrecklich sein.

Exakt. Um es auf die Spitze zu treiben, können sogar alle praktischen Implementierungen von Algorithmen auf Computern als O(1) betrachtet werden (mit einer großen Konstante davor). Dies liegt eindeutig daran, dass es nur eine endliche Menge an Möglichkeiten für Eingabedaten gibt (endliche Menge an Speicher und endliche Menge an Maschinennummern).