Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
c++: funktion für die zeitdauer von sortieralgorithmen?!
- Ersteller hasugoon
- Erstellt am
TK-Shockwave
Lt. Commander
- Registriert
- März 2003
- Beiträge
- 1.314
Also ich Stimme dem bei..
Bau dir einen Timespan Counter der durch Start- und endzeit die benötigte Zeit berechnet.
sortierst du Strings/Array/Pointer?
Im Allg. sagt man das BubbleSort für große Dinge zu lahm ist..der Binäre-Suchalgorythmus dagegen sehr schnell bei großen Daten mengen.
Bau dir einen Timespan Counter der durch Start- und endzeit die benötigte Zeit berechnet.
sortierst du Strings/Array/Pointer?
Im Allg. sagt man das BubbleSort für große Dinge zu lahm ist..der Binäre-Suchalgorythmus dagegen sehr schnell bei großen Daten mengen.
- Registriert
- Juni 2004
- Beiträge
- 2.798
danke für die schnelle hilfe. ich denk mal wieder viel zu kompliziert 
ich habe bis jetzt int-arrays der größe 100k mittels selection-/insertionsort sortiert. darüber muss ich erst mal den stack vergrößern und quicksort beschäftigt mich noch etwas. haben erst heute in der vorlesung das erste mal rekursion gehabt oO
______________insertionsort____________selectionsort
vergleiche:______~2.5e9_________________~5.0e9
austauschen:____~2.5e9 (worst case)______ ~1.0e4
zeit:___________~26500ms_______________~31000ms
=> vergleiche sind teuer

ich habe bis jetzt int-arrays der größe 100k mittels selection-/insertionsort sortiert. darüber muss ich erst mal den stack vergrößern und quicksort beschäftigt mich noch etwas. haben erst heute in der vorlesung das erste mal rekursion gehabt oO
______________insertionsort____________selectionsort
vergleiche:______~2.5e9_________________~5.0e9
austauschen:____~2.5e9 (worst case)______ ~1.0e4
zeit:___________~26500ms_______________~31000ms
=> vergleiche sind teuer

Zuletzt bearbeitet:
7H3 N4C3R
Lt. Commander
- Registriert
- Feb. 2002
- Beiträge
- 1.816
CsA-eViL schrieb:=> vergleiche sind teuer![]()
Öhm, das ist genau der falsche Schluss.

Deine Ergebnisse belegen das auch.

Btw, die GetTickCount-Funktion "tickt" nur ca. im 51ms Takt und wird bei hoher Rechenbelastung des PC's ungenau. Von daher solltest du - wenn du sie benutzen möchtest - immer ausreichend viele Operationen durchführen.
- Registriert
- Juni 2004
- Beiträge
- 2.798
7H3 N4C3R schrieb:Öhm, das ist genau der falsche Schluss.Vergleiche sind bei weitem nicht so teuer wie Vertauschungen.
Deine Ergebnisse belegen das auch.Doppelt soviele Vergleiche, aber trotzdem bei weitem nicht die doppelte Zeit. D.h. dass Vergleiche im Vergleich zu Vertauschungen billiger sein müssen.
hm aber in der summe kommen beide algorithmen auf die gleiche summe an operationen.
aber mal davon abgesehn, dass der 2te sortieralgorithmus u.U. vom code nicht so optimal ist und die zeitliche differenz eigentlich marginal ist, kann man das glaub eh net unbedingt miteinander vergleichen

7H3 N4C3R
Lt. Commander
- Registriert
- Feb. 2002
- Beiträge
- 1.816
Also mal das ganze Anhand der ungefähren Arbeitsweise eines Mikroprozessors beschrieben. 
Vergleichen:
- Wert1 aus dem Speicher in Register 1 laden
- Wert2 aus dem Speicher in Register 2 laden
- Register1 mit Register2 vergleichen und Ergebnis in einem Flag ablegen
( - bedingter Sprung anhand des Flags)
Vertauschen:
- Wert1 aus dem Speicher in Register 1 laden
- Wert2 aus dem Speicher in Register 2 laden
- Register1 in den Speicher schreiben an die Speicherstelle von Wert2
- Register2 in den Speicher schreiben an die Stelle von Wert1
Zweiteres sind 4 Operationen, ersteres nur 3. Zusätzlich sind Routinen, die auf den Speicher zugreifen im Vergleich zu Operationen, die rein auf Prozessorregistern arbeiten (oder solche die rein den Programmfluss steuern, z.B. bedingte Sprünge) "extrem" (!) teuer.
Normalerweise stehen die benötigten Werte im Prozessor-Cache, was die Zugriffe schon wesentlich billiger macht - aber immernochnicht so billig wie eine Operation innerhalb der Register. Sobald es aber tatsächlich auf den Arbeitsspeicher geht, ist das wie Fahren mit gezogener Handbremse.
Das ist die Theorie. Compiler und Prozessor optimieren hier gewaltig und sorgen beispielsweise dafür, dass möglichst viele Daten im Cache stehen. Außerdem kann das Laden von einem der beiden Werte in ein Register entfallen, wenn dieser Wert in einer Schleife z.B. konstant bleibt. Trotzdem ist vertauschen amortisiert immer teurer als vergleichen.

Vergleichen:
- Wert1 aus dem Speicher in Register 1 laden
- Wert2 aus dem Speicher in Register 2 laden
- Register1 mit Register2 vergleichen und Ergebnis in einem Flag ablegen
( - bedingter Sprung anhand des Flags)
Vertauschen:
- Wert1 aus dem Speicher in Register 1 laden
- Wert2 aus dem Speicher in Register 2 laden
- Register1 in den Speicher schreiben an die Speicherstelle von Wert2
- Register2 in den Speicher schreiben an die Stelle von Wert1
Zweiteres sind 4 Operationen, ersteres nur 3. Zusätzlich sind Routinen, die auf den Speicher zugreifen im Vergleich zu Operationen, die rein auf Prozessorregistern arbeiten (oder solche die rein den Programmfluss steuern, z.B. bedingte Sprünge) "extrem" (!) teuer.
Normalerweise stehen die benötigten Werte im Prozessor-Cache, was die Zugriffe schon wesentlich billiger macht - aber immernochnicht so billig wie eine Operation innerhalb der Register. Sobald es aber tatsächlich auf den Arbeitsspeicher geht, ist das wie Fahren mit gezogener Handbremse.
Das ist die Theorie. Compiler und Prozessor optimieren hier gewaltig und sorgen beispielsweise dafür, dass möglichst viele Daten im Cache stehen. Außerdem kann das Laden von einem der beiden Werte in ein Register entfallen, wenn dieser Wert in einer Schleife z.B. konstant bleibt. Trotzdem ist vertauschen amortisiert immer teurer als vergleichen.
Zuletzt bearbeitet:
MagicAndre1981
Admiral
- Registriert
- Feb. 2004
- Beiträge
- 7.463
Schau dir mal die QueryPerformanceCounter Function an.
Ähnliche Themen
- Antworten
- 58
- Aufrufe
- 6.603
- Antworten
- 20
- Aufrufe
- 6.675
- Antworten
- 4
- Aufrufe
- 7.035
G