Die kleinste von 8 Variablen löschen?



  • raii schrieb:

    Nun ja, im nächsten Fall, in dem wir dann alle eine Funktion brauchen, die aus 8 Zahlen mit beschränkten Gültigkeitswerten die kleinsten Werte auf ungültige Werte setzt, können wir ja dann alle ein Array verwenden.

    Wieso "alle ein Array verwenden"?
    Du nimmst einfach das, was am besten zu den Anforderungen passt.



  • Andromeda schrieb:

    Das lässt sich sogar noch auf die Spitze treiben, wie ein Freund von mir zu sagen pflegt: "die beste Software ist keine Software".

    Also im vorliegenden Fall: "Generier nur sieben Zahlen."



  • Generatorix schrieb:

    Andromeda schrieb:

    Das lässt sich sogar noch auf die Spitze treiben, wie ein Freund von mir zu sagen pflegt: "die beste Software ist keine Software".

    Also im vorliegenden Fall: "Generier nur sieben Zahlen."

    Oder: "achte beim Erzeugen darauf, dass die kleinste Zahl nur ein Mal vorkommt". 🙂



  • Andromeda schrieb:

    Wieso "alle ein Array verwenden"?
    Du nimmst einfach das, was am besten zu den Anforderungen passt.

    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.



  • 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?


Anmelden zum Antworten