Die kleinste von 8 Variablen löschen?



  • raii schrieb:

    Ja ich schon. OP auch? Vermutlich nicht.
    Daher ist der Vorschlag erstmal einen vector zu benutzen für einen Anfänger völlig richtig und nachvollziehbar. Zumal es sogar in den unwahrscheinlichen Fällen, dass ein Array ohne zusätzliche, lästige Aufgaben verwendet werden kann, immer noch völlig korrekt und sauber ist, ein vector oder ähnliches als container zu verwenden.

    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.



  • wob schrieb:

    Bei einem Array musst du von Hand die Größe mittracken und vor allem nach dem Löschen des kleinsten Elementes alle nachfolgenden verschieben. v.erase() ist wesentlich einfacher.

    Echt? So richtig mit "alle nachfolgenden verschieben"?! Ist das die einzige Möglichkeit, etwas aus einem vector/array zu "löschen"?
    Deshalb vielleicht besser erstmal die Grundlagen lernen.
    Und wozu muss man die Größe mittracken?? Sie ist vorher 8 und nach dem "rauslöschen" 7. Fertig.
    Das hochkomplizierte Rauslöschen des Arrayelements an Position p geht übrigens mit

    arr[p]=arr[7];
    


  • volkard schrieb:

    Das hochkomplizierte Rauslöschen des Arrayelements an Position p geht übrigens mit

    arr[p]=arr[7];
    

    Kannst du das bitte erläutern?

    Demnach wäre arr[7] doch unlöschbar bzw. immer gelöscht.
    Ich kann deine Gedanken nicht nachvollziehen. 😞



  • Andromeda schrieb:

    volkard schrieb:

    Das hochkomplizierte Rauslöschen des Arrayelements an Position p geht übrigens mit

    arr[p]=arr[7];
    

    Kannst du das bitte erläutern?

    Demnach wäre arr[7] doch unlöschbar bzw. immer gelöscht.
    Ich kann deine Gedanken nicht nachvollziehen. 😞

    LOL, du bist wohl auch nicht so der "Freund kleiner, angepasster und ultraperformanter Lösungen". Ne, lass mal lieber ne If-Abfrage bei jeder Nutzung des Arrays einfügen. Du solltest wirklich mal einen Gang zurückschalten.



  • 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).


Anmelden zum Antworten