Minimum
-
Nein, du musst die Werte so bereitstellen das du durch diese iterieren kannst.
grüße
-
Ich weiß nicht, ob das das ist, was ich suche.
Ich will ja nur, dass ich z.B. die Werte (8,7,300,655,1000) habe und dann gibt er mir aus der kleinste Wert ist 7.
-
Dann bastel dir halt fix was:
template< typename T > const T &minimum( const T &t1, const T &t2 ) { return t1 < t2 ? t1 : t2; } template< typename T > const T &minimum( const T &t1, const T &t2, const T &t3 ) { return t1 < minimum( t2, t3 ) ? t1 : minimum( t2, t3 ); } template< typename T > const T &minimum( const T &t1, const T &t2, const T &t3, const T &t4 ) { return t1 < minimum( t2, t3, t4 ) ? t1 : minimum( t2, t3, t4 ); }Oder ähnliches...
-
Und diese Werte gibt Du in den Programmcode ein?
-
int x = std::min(std::min(std::min(std::min(8,2), -5), 44), 50);
-
Ja, aber wenn ich z.B. 3000 Werte habe und soll da den geringsten finden, ist es halt nicht mehr fix gebastelt, deshalb frag ich mich ob's da irgendwas gibt.
-
Plotzenhotz schrieb:
int x = std::min(std::min(std::min(std::min(8,2), -5), 44), 50);Wunderschön...

becks schrieb:
Ja, aber wenn ich z.B. 3000 Werte habe und soll da den geringsten finden, ist es halt nicht mehr fix gebastelt, deshalb frag ich mich ob's da irgendwas gibt.
Dann legst du die Werte in einen Container ab und nimmst min_element.
grüße
-
Hmm. Ich habe ja leider (noch) kaum Ahnung von C++, deshalb weiß ich nicht wie ich das mit den Werten ablegen machen soll.
-
Hi!
#include <iostream> #include <vector> #include <algorithm> // ... std::vector< int > container; // Irgendwelche Werte in den Kontainer schieben container.push_back( 50 ); container.push_back( 400 ); container.push_back( 620 ); container.push_back( 20 ); container.push_back( 233 ); std::cout << *std::min_element( container.begin(), container.end() );So ungefähr.
grüße
-
Vielen Dank! Jetzt müsste ich's hinbekommen.
-
Kann ich auch Variablen ablegen?
container.push_back( x );
-
Ja... Aber versuchs doch einfach!
-
Ich würde einfach einen binären Baum nehmen, nach dem Einfügen ist der min. Wert dann im linken Unterbaum, der max. Wert im rechten Unterbaum.
aus http://www.informatiktreff.de/materialien/sek_ii/algorithmen/baum/baum.htm
6. Baumsortieren als Sortierverfahren
Eine Anwendungsmöglichkeit des binären Suchbaums ist es, ihn zum Sortieren einer Feldstruktur zu benutzen. Nehmen wir also an, wir wollten eine Feldstruktur mit den folgenden Werten sortieren:
55 , 14 , 98 , 54 , 17 , 56 , 86 , 87 , 9 , 1 , 45 , 75
Als ersten Schritt erzeugen wir einen leeren Suchbaum.
Als zweiten Schritt sortieren wir die Zahlen der Feldstruktur der Reihe nach in diesen Suchbaum ein, unter Beachtung der für das Einfügen geltenden Bedingungen.
Der nächste Schritt ist dann, die im Suchbaum sortierten Zahlen mit einem geeigneten Durchlauf auszulesen und in die mittlerwelie geleerte Feldstruktur zurückzuschreiben. Ein binärer Suchbaum erfüllt ja die Bedingung, dass im linken Unterbaum eines Knotens niedrigere, im rechten Unterbaum höhere Zahlen stehen als in ihm selbst. Diese Eigenschaft kann man sich mit der Inorder-Traversierung zu nutze machen, da diese dann die Zahlen in der geordneten Reihenfolge ausliest.
Während des Durchlauf muss man nun nur noch die Zahlen in die Feldstruktur kopieren, die danach aufsteigend sortiert ist:
1 , 9 , 14 , 17 , 45 , 54 , 55 , 56 , 75 , 86 , 87 , 98
Weiter Möglichkeit wäre es, die Werte in einen Vector zu packen und ihn dann mit einem Sortieralgo zu sortieren. Der Baum hat den Vorteil, dass die Werte schon beim Einfügen sortiert werden.
-
Wieso würde man einen Baum verwenden wollen wenn man O(N) haben kann?
-
Plotzenhotz schrieb:
Wieso würde man einen Baum verwenden wollen wenn man O(N) haben kann?
Wo hast du O(N)?
Ausserdem ist der Aufwand für das Einfügen in einen Baum O(log n), im schlimmsten Fall O(n).
-
Einmal drüber laufen und das kleinste merken ist Laufzeit O(N), allein den Baum aufzubauen oder zu sortieren kostet O(N log N) Laufzeit. Aber hey, dafür wird ja ein Baum vewendet.

-
Jester schrieb:
Einmal drüber laufen und das kleinste merken ist Laufzeit O(N), allein den Baum aufzubauen oder zu sortieren kostet O(N log N) Laufzeit. Aber hey, dafür wird ja ein Baum vewendet.

Ich glaub du brauchst eine Auffrischung deiner Kenntnisse in Bäumen. Einfügen kostet dich O(log n), nachdem du _alles_ eingefügt hast, ist der Baum sortiert.
Ausserdem was ist wenn er dann das 2. kleinste Element braucht? Nochmal alles durchsuchen?
-
DEvent schrieb:
Jester schrieb:
Einmal drüber laufen und das kleinste merken ist Laufzeit O(N), allein den Baum aufzubauen oder zu sortieren kostet O(N log N) Laufzeit. Aber hey, dafür wird ja ein Baum vewendet.

Ich glaub du brauchst eine Auffrischung deiner Kenntnisse in Bäumen. Einfügen kostet dich O(log n), nachdem du _alles_ eingefügt hast, ist der Baum sortiert.
Ausserdem was ist wenn er dann das 2. kleinste Element braucht? Nochmal alles durchsuchen?
Lol, willst Du jetzt mit mir drüber diskutieren wie lange es dauert n Elemente in nen Baum einzufügen? Eine Einfügung kostet O(log N), N Elemente Einfügen kostet O(N log N). In O(log N) kannst Du Dir nichtmal alle Elemente anschaun.
Wenn er das kleinste und das zweitkleinste haben will (oder die k kleinsten, k Konstante), dann geht das immer noch in O(N) und man muß nicht auf O(N log N) Laufzeit hoch. Außerdem war das auch nicht die Aufgabenstellung. Er hat schließlich nach dem kleinsten Element statt nach Sortierung gefragt.
edit: selbst einfach nochmal durchsuchen ist besser als den langsameren Algorithmus zu nehmen.

-
Jester schrieb:
DEvent schrieb:
Jester schrieb:
Einmal drüber laufen und das kleinste merken ist Laufzeit O(N), allein den Baum aufzubauen oder zu sortieren kostet O(N log N) Laufzeit. Aber hey, dafür wird ja ein Baum vewendet.

Ich glaub du brauchst eine Auffrischung deiner Kenntnisse in Bäumen. Einfügen kostet dich O(log n), nachdem du _alles_ eingefügt hast, ist der Baum sortiert.
Ausserdem was ist wenn er dann das 2. kleinste Element braucht? Nochmal alles durchsuchen?
Lol, willst Du jetzt mit mir drüber diskutieren wie lange es dauert n Elemente in nen Baum einzufügen? Eine Einfügung kostet O(log N), N Elemente Einfügen kostet O(N log N). In O(log N) kannst Du Dir nichtmal alle Elemente anschaun.
Ob ein Baum sinnvoll ist kommt wohl ganz einfach drauf an was der OP konkret vorhat, nicht?
Jester schrieb:
Wenn er das kleinste und das zweitkleinste haben will (oder die k kleinsten, k Konstante), dann geht das immer noch in O(N) und man muß nicht auf O(N log N) Laufzeit hoch. Außerdem war das auch nicht die Aufgabenstellung. Er hat schließlich nach dem kleinsten Element statt nach Sortierung gefragt.
edit: selbst einfach nochmal durchsuchen ist besser als den langsameren Algorithmus zu nehmen.

Dürfte im Suchbaum beides schneller sein als nochmal komplett durch den Container zu tingeln... wie kommst du auf O(N log N)?

-
Konkret hat der OP vor das Minimum zu bestimmen. Ein Baum ist ergo nicht sinnvoll.
Zum zweiten ne kleine gegenfrage: in welcher Laufzeit möchtest Du den Suchbaum aufbauen? O(N)?
Bedenke: Ist der Suchbaum schon aufgebaut, so kann man ihn in-order traversieren und so ne sortierte Folge rauslassen und zwar in O(N) Laufzeit. Da wir aber alle wissen (tun wir das?), daß Sortieren O(N log N) Vergleichsoperationen benötigt muß das Aufbauen des Baums schonmal mindestens O(N log N) Laufzeit benötigen.Ich bin dennoch auf Deine Analyse für die Laufzeit beim Aufbau des Baums gespannt.

Natürlich ist es schneller wenn man den Suchbaum schon hat. Nur den aufzubauen ist langsamer als 2mal durchzutingeln.
edit: um euren Lösungsvorschlag mal konkret zu implementieren. Ihr sagt: hau alles in ne std::map rein und nimm dann *myMap.begin(); Und das wollt ihr uns nun als tolle Lösung für das Problem verkaufen? Wenn ihr das vorher noch schön in ne Funktion packt schick ich's direkt bei thedailywtf.com ein.