Miniprog: Wer liefert schnellstes snippet :) -> anzahl gleicher zahlen in folge
-
Danke Hustbaer,
interessant mit den Komplexitätsmaßen...also der input kann wirklich sehr stark variieren , von 20 bis 20000 z.B.
Also erreichen wir ja dann wohl so nur O(nlogn).Leider lese ich jetzt in den posts immer wieder das die ein oder andere version nicht funktioniert....welche könnte denn jetzt passen - die von blogg? Aber braucht die auch wirklich nur O(nlogn) ?
-
Funktionieren tut hier eigentlich alles, dass was ich hier dauernd gepostet habe, hat ja nichts wirklich was damit zu tun.
Meine funktionierende Variante von Seite 1 war ja die hier:
int a[] = { 1,1,2,2,2,3,3,5,5,5,5,5 }; const int num = sizeof(a)/sizeof(int); map<int,int> mappo; for(int i=0; i<num; ++i) ++mappo[a[i]];
-
Meins müsste auch funktionieren (nimm wenn dann die zweite Version)

Hat außerdem erst die Laufzeit O(n) fürs zählen und anschließend O(nlogn) fürs sortieren, also insgesamt auch O(n) (edit: natürlich n*logn!)
Wenn dir die Laufzeit so wichtig ist, prüf doch erst alle Algorithmen auf Korrektheit durch und benchmarke sie dann..
-
Badestrand schrieb:
Meins müsste auch funktionieren (nimm wenn dann die zweite Version)

Hat außerdem erst die Laufzeit O(n) fürs zählen und anschließend O(nlogn) fürs sortieren, also insgesamt auch O(n)
Wenn dir die Laufzeit so wichtig ist, prüf doch erst alle Algorithmen auf Korrektheit durch und benchmarke sie dann..
Badestrand... deine Version hat im besten Fall O(N log N) und im schlechtesten Fall O(N^2).
-
hustbaer schrieb:
Badestrand... deine Version hat im besten Fall O(N log N) und im schlechtesten Fall O(N^2).
Oh, ich meinte eigentlich auch O(n*log(n))..
Und er kann ja auch den Introsort implementieren, der hat auch nlogn als Worst-Case... *brummel*edit: Habs mal ausprobiert, die map-Methode von KasF steckt mein Quicksort und das set locker in die Tasche
Je mehr verschiedene Elemente gegeben sind, desto mehr setzt sich map ab (Faktor > 50), bei wenigen verschiedenen Elementen (bis~100) gewinnt wenigstens noch mein Quicksort.
Gebenchmarkt mit MSVC++ 2003.
-
@badestrand:
Ich weiß es gehört jetzt überhaupt nicht hierher....aber wie misst du deinen code eigentlich? Also könntest du vielleicht deine Zeitmess-Methodik posten?
Merci
-
Badestrand... deine Version hat auch ohne den Sort im besten Fall O(N*M) und im schlechtesten Fall ist eben N=M -> O(N^2).
Guck dir mal deine verschachtelte Schleife näher an...
-
hustbaer schrieb:
Badestrand... deine Version hat auch ohne den Sort im besten Fall O(N*M) und im schlechtesten Fall ist eben N=M -> O(N^2).
Guck dir mal deine verschachtelte Schleife näher an...
Ja ich weiß... Für eine hohe Anzahl an out-Werten ist meine Methode ziemlich ziemlich schlecht
Ich sag ja gar nix mehr dagegen 
gast_xy schrieb:
@badestrand:
Ich weiß es gehört jetzt überhaupt nicht hierher....aber wie misst du deinen code eigentlich? Also könntest du vielleicht deine Zeitmess-Methodik posten?
Merci// Die beiden Parameter bestimmen die Laufzeit des Programms size_t in_size = 1000000, // Wieviele Zahlen sind im Array max_in_value = 1000; // Wie groß ist die Streuung der Zahlen // "in" mit Zufallswerten füllen int* in = new int [ in_size ]; srand( GetTickCount() ); for ( size_t i=0; i<in_size; i++ ) in[i] = rand() % max_in_value; // "out"-Größe ermitteln und std::map<int,int> vals; for ( size_t i=0; i<in_size; i++ ) ++ vals[ in[i] ]; size_t out_size = vals.size(); int* out = new int [ out_size ]; typedef void(*lala)(const int*,size_t,int*,size_t); lala funcs[3] = { lala1, lala2, lala3 }; // Das sind die verwendeten Funktionen for ( size_t i=0; i<sizeof(funcs)/sizeof(funcs[0]); ++i ) { memset( out, 0, out_size*sizeof(int) ); time_t start = GetTickCount(); cout << "Beginning..." << endl; funcs[i]( in, in_size, out, out_size ); cout << "Finished...: " << GetTickCount()-start << " ms" << endl; for ( size_t j=0, k=0; j<out_size; j++ ) k += j*out[j]; cout << "Checksum: " << j << endl << endl; } delete[] in; delete[] out; // Die verwendeten Funktionen müssen diesen Kopf haben: // void lala3( int const* in, size_t in_size, int* out, size_t out_size )
-
die verwurstete bucketsort variante kam doch bereits und die rennt in verdammt linearer zeit. glaub kaum, dass man ne lösung findet, die nicht wenigstens alle elemente einmal angucken muss.
-
Wenn wir schon so dabei sind:
BucketSort kann man eigentlich nicht mit den anderen Verfahren vergleichen weil es zusätzliche Annahmen trifft die für die "gewöhnlichen" Sortierverfahren nicht gelten. Z.B Gleichverteilung des inputs. Außerdem ist es kein in-place verfahren - braucht also zusätzlichen Speicher (was u.U. doch ein Argument sein kann).
Außerdem gilt die Unterbietung der unteren schranke von O(nlogn) nur für den average case....