Die kleinste von 8 Variablen löschen?



  • m.e. schrieb:

    LOL, du bist ...

    Nix LOL. Sag wie das funktioniert und lass mich nicht dumm sterben. 🙂



  • damit ist gemeint, dass du einfach das letzte element für ungültig erklärst.

    du hast also ein array arr mit den elementen arr[0]...arr[7], findest irgendwie heraus, dass bspw. arr[3] das kleinste ist und kopierst dann den wert von arr[7] nach arr[3].

    natürlich sollte das programm dann wissen, dass arr[7] ungültig ist, z.b. mit der zuweisung letztes_array_element=6;

    edit: die vector-klasse in c++ macht eigentlich nichts anderes.
    der unterschied ist einfach, dass sich da schonmal jemand die arbeit gemacht hat, dieses prinzip zu programmieren, damit sich andere leute nicht mehr damit beschäftigen müssen und gleich loslegen können.



  • HansKlaus schrieb:

    du hast also ein array arr mit den elementen arr[0]...arr[7], findest irgendwie heraus, dass bspw. arr[3] das kleinste ist und kopierst dann den wert von arr[7] nach arr[3].

    Okay, das funktioniert doch aber nur, wenn alle Werte unterschiedlich sind.

    Von dieser Einschränkung erwähnte der Fragesteller nichts, wie ich das in Erinnerung habe.



  • naja er erwähnte in seinem beispiel, dass eine der beiden kleinsten zahlen gelöscht werden soll. das wird dann im einfachsten fall diejenige sein, die weiter vorne steht.



  • HansKlaus schrieb:

    naja er erwähnte in seinem beispiel, dass eine der beiden kleinsten zahlen gelöscht werden soll. das wird dann im einfachsten fall diejenige sein, die weiter vorne steht.

    Er erwähnte in seinem Beispiel, dass alle Zahlen über "rand()%6+8" erzeugt werden. Dass alle Zahlen unterschiedlich sind, ist sehr unwahrscheinlich und im schlimmsten Fall können sogar alle gleich sein.



  • Sipps schrieb:

    Das Ergebnis:

    a= 9
    b= 9
    c= 11
    d= 13
    e= 8
    f= 11
    g= 10
    h= 8

    Hier soll dann e oder h rausgeschmissen werden. Ich habe das hier absichtlich so gewählt das 2 Variablen den minimal Wert hat da das durch aus passieren kann.

    er will doch ausdrücklich mehrere gleiche zahlen haben, oder habe ich da was verpasst?

    davon mal abgesehen zeichnen sich vektoren doch dadurch aus, dass gleiche elemente nicht erlaubt sind, oder habe ich da etwas falsch in erinnerung?



  • HansKlaus schrieb:

    davon mal abgesehen zeichnen sich vektoren doch dadurch aus, dass gleiche elemente nicht erlaubt sind, oder habe ich da etwas falsch in erinnerung?

    Ick kenne das von Java: ein Vector kann das gleiche Objekt mehrfach enthalten. Im Gegesatz zum "Set"-Interface, das sich an Cantors Mengenlehre orientiert.

    Bei C++ wird es nicht anders sein. Würde mich jedenfalls wundern.



  • Andromeda schrieb:

    Bei C++ wird es nicht anders sein. Würde mich jedenfalls wundern.

    Also nochmal zusammengefasst: Du kennst Java recht gut, hast von C++ eine ungefähre Vorstellung.

    Und mit diesem Vorwissen willst du uns Tipps zur ultimativen Verbesserung der Performance geben?



  • daddy_felix schrieb:

    Andromeda schrieb:

    Bei C++ wird es nicht anders sein. Würde mich jedenfalls wundern.

    Also nochmal zusammengefasst: Du kennst Java recht gut, hast von C++ eine ungefähre Vorstellung.

    Und mit diesem Vorwissen willst du uns Tipps zur ultimativen Verbesserung der Performance geben?

    Ist doch ganz einfach: Rauslöschen aus Arrays geht mittels einer simplen Zuweisung. Das ist mit keiner noch so auf Speed getrimmten Datenstruktur zu schlagen. Das gilt in jeder Sprache. 🙂



  • Das sehe ich ein bischen anders, aber wenn du meinst... 😕



  • daddy_felix schrieb:

    Das sehe ich ein bischen anders, aber wenn du meinst... 😕

    Vectors, Queues, und ähliches Zeug haben immer einen gewissen Verwaltungsaufwand. Oft stecken verkette Listen dahinter.

    Sicherlich sind sie in einigen Fällen erste Wshl, Aber nicht bei 8 popeligen Integers.



  • Ist doch ganz einfach: Rauslöschen aus Arrays geht mittels einer simplen Zuweisung.

    wie kommst du darauf?

    es kommt sehr stark auf die Natur des Containers an - Continous(dann muss man kopieren), als LinkList (dann eben nur 1 oder 2 Pointer setzen usw.) - aber die Welt ist definitiv ein wenig komplizierter als du Sie an der Oberfläche denkst zu verstehen

    wie ist denn ein Java-Vector unter der Haube implementiert?



  • Andromeda schrieb:

    Vectors, Queues, und ähliches Zeug haben immer einen gewissen Verwaltungsaufwand. Oft stecken verkette Listen dahinter.

    Damit hast du gerade selbst zugegeben, keine Ahnung von std::vector zu haben.



  • Gast3 schrieb:

    wie ist denn ein Java-Vector unter der Haube implementiert?

    In Java entspricht die java.util.ArrayList dem C++-Vector. java.util.Vector dagegen hat ebenfalls unterliegend eine Array-Implementierung, aber ist synchonized (threadsicher).



  • Andromeda schrieb:

    Nach dem Trick behandelt man arr wie ein 7-elementiges Array und benutzt nur die ersten 7 Indizes. Das geht, weil die Indizes fortlaufend sind. Der eigentliche Nachteil an der Methode ist, dass sich die Reihenfolge der Elemente ändert.

    Wenn man das Array-Element auf einen ungültigen Wert setzt, muss man bei jedem Zugriff prüfen, ob das Element auch gültig ist. Das halte ich für deutlich umständlicher.



  • Man ändert nicht nur die Reihenfolge (was bei der gestellten Aufgabe möglicherweise sogar in Ordnung wäre), sondern man muss auch die Größe von Hand tracken. Das wurde zwar von volkard verneint, aber ich frage mich, wo dann bei ihm im selben Post die Zahlen 8 und 7 herkommen (wenn er mal nicht doch die Größe trackt...) - ich hasse jedenfalls irgendwelche wilden hardgecodeten Zahlen im Programm.

    Und inband als "ungültigen Wert" setzten funktioniert auch nur, wenn das ALLE Funkionen, denen man das Array übergibt, das später auch tun (und man kann dadurch nicht mehr "einfach so" indexieren).

    Zusammengefasst: die Gegenvorschläge tun beide etwas anderes als nur ein Element herauszulöschen. Ob das hier erlaubt ist, ist nicht von vorne her klar. Daher bleibt für mich nur: vector::erase benutzten und sicher sein (oder eben von Hand alle Elemente nach dem zu löschenden um 1 nach links zu verschieben).



  • Andromeda schrieb:

    Ich finde es gerade blöd, einen Anfänger zu sehr vor den grundlegen Prinzipien der Computerei abzuschirmen. Aber darüber gibt es ja verschiedene Ansichten.

    Ich vermute mal, dass alle Top-Coder ziemlich zu Anfang eine Phase hatten, in der sie sich ausgiebig mit LowLevel-Zeugs und Maschinensprache beschäftigten. Sicher kann man das auch später lernen, aber dann baut man IMHO nicht die Assoziationen auf, die für ein Tiefenverständnis wichtig sind.

    Andromeda schrieb:

    Vectors, Queues, und ähliches Zeug haben immer einen gewissen Verwaltungsaufwand. Oft stecken verkette Listen dahinter.

    Mein Gott, ist dir das nicht selbst peinlich? Aber schon wieder gut beim Bullshitbingo dabei ("Cantors Mengenlehre").



  • m.e. schrieb:

    Andromeda schrieb:

    Ich finde es gerade blöd, einen Anfänger zu sehr vor den grundlegen Prinzipien der Computerei abzuschirmen. Aber darüber gibt es ja verschiedene Ansichten.

    Ich vermute mal, dass alle Top-Coder ziemlich zu Anfang eine Phase hatten, in der sie sich ausgiebig mit LowLevel-Zeugs und Maschinensprache beschäftigten. Sicher kann man das auch später lernen, aber dann baut man IMHO nicht die Assoziationen auf, die für ein Tiefenverständnis wichtig sind.

    Andromeda schrieb:

    Vectors, Queues, und ähliches Zeug haben immer einen gewissen Verwaltungsaufwand. Oft stecken verkette Listen dahinter.

    Mein Gott, ist dir das nicht selbst peinlich?

    Was stört dich daran?



  • wob schrieb:

    Man ändert nicht nur die Reihenfolge (was bei der gestellten Aufgabe möglicherweise sogar in Ordnung wäre), sondern man muss auch die Größe von Hand tracken. Das wurde zwar von volkard verneint, aber ich frage mich, wo dann bei ihm im selben Post die Zahlen 8 und 7 herkommen (wenn er mal nicht doch die Größe trackt...) - ich hasse jedenfalls irgendwelche wilden hardgecodeten Zahlen im Programm.

    Unter "tracken" verstehe ich das Mitführen in Variablen wie "arrCount--" und "arrCount++" jedes mal, wenn sich die Anzahl der gültigen Werte ändert.
    Unter "nicht tracken" verstehe ich, wie in der Aufgabenstellung verlangt, genau vorher 8 und nachher 7 zu haben. Ich nehme an, er weiß genau, weshalb er vorher 8 hat, weils zum Beispiel in den Spielregeln des Kartenspiels, was er proggert genau so steht. Dann muss man nicht den Code so verallgemeinern, daß im Prinzip ein Schachbrett 121 Felder haben könnte, und man wegen sogfältigen Designs sofort anpassen kann, wenn die FIDE die Regeln ändert.
    Klar, Du hast vollkommen recht, wenns irgendwie um was anderes als wörtliche Verfolgung der Aufgabenstellung geht. Niemals nie darf man es sich so einfach machen, wenn der Kunde im Vertrag bestellt hat, daß die Zooverwaltung genau 8 Tiere hat und man das mit am wenigsten Fleisch verkaufen will. Selbst wenn er den Vertrag mit Blut unterschreibt, es ist ein Naturgesetz, daß nachdem der Zoowärter die Probleme dem Zooeinkäufer und der dem Softwareverkäufer und der dem Softwareentwickler es gesagt hat, daß 90% des Gemeinten auf der Strecke geblieben ist und nach Fertigstellung verlangt wird, daß auf Kulanz 9 Tiere möglich sind. Du hast es aus Erfahrung richtig gemacht; sich einfach nicht belabern lassen.
    Hier ging ich davon aus, daß die 8 aber stabil ist.



  • Andromeda schrieb:

    m.e. schrieb:

    Andromeda schrieb:

    Ich finde es gerade blöd, einen Anfänger zu sehr vor den grundlegen Prinzipien der Computerei abzuschirmen. Aber darüber gibt es ja verschiedene Ansichten.

    Ich vermute mal, dass alle Top-Coder ziemlich zu Anfang eine Phase hatten, in der sie sich ausgiebig mit LowLevel-Zeugs und Maschinensprache beschäftigten. Sicher kann man das auch später lernen, aber dann baut man IMHO nicht die Assoziationen auf, die für ein Tiefenverständnis wichtig sind.

    Andromeda schrieb:

    Vectors, Queues, und ähliches Zeug haben immer einen gewissen Verwaltungsaufwand. Oft stecken verkette Listen dahinter.

    Mein Gott, ist dir das nicht selbst peinlich?

    Was stört dich daran?

    Ach, gar nichts. Ich habe den Fehler gemacht anzunehmen, dass man dich Troll nur im NadrW-Forum ignorieren sollte.


Anmelden zum Antworten