Map Madness - GML ist bescheuert!

  • Map Madness - GML ist bescheuert!

    Hallo Leute,

    kann mir jemand mal erklären was das soll?


    GML-Quellcode

    1. var map;
    2. map = ds_map_create();
    3. ds_map_add(map, "a", 1);
    4. ds_map_add(map, "b", 4);
    5. ds_map_add(map, "d", 5);
    6. ds_map_add(map, "c", 14);
    7. show_message(ds_map_find_next(map, "d"));
    8. show_message(ds_map_find_next(map, "c"));
    Alles anzeigen


    Erwartet:

    1) c
    2) Keine Ausgabe

    Was macht GML:

    1) Keine Ausgabe
    2) d


    Das ist doch mal voll :headtouch:
    On teh internet u pwn noobs - but in real life noobs own you.
  • Tatsache, GML scheint Maps intern nach Schlüssel zu sortieren, sodass d nach c kommt...
    Aber eigentlich ist das doch egal, solange du bei einer Iteration alle Werte erhälst, oder? Die Reihenfolge ist halt dann eine andere, als die in der es hinzugefügt wurde.
    “Computers are good at following instructions, but not at reading your mind.” (Donald Knuth)

    Ich schreibe mit Neo.
  • Anstatt hier über GML zu meckern hättest du einfach mal in die Hilfe schauen können, dort steht nämlich, dass bezüglich next und previous die map sortiert ist wie Bottleneck auch schon gesagt hat. Also frag ich mich wo sich deiner Meinung nach GML unerwartet verhält. Auch in anderen Programmiersprachen ist eine map ein nach Schlüsseln sortiertes assoziatives Array.
  • Map, HashMap, Assotiatives Array ist alles das gleiche -> Key, Value Pairs.

    Und nein, in anderen Programmiersprachen ist das normalerweise nicht so (Java, Perl, PHP, Python nur um ein paar zu nennen), dass das Array nach Schlüsseln automatisch sortiert wird.

    Und warum? Weil es ineffizent ist. Du musst nach jedem einfügen eines Schlüssels neu sortieren.

    Meckern tue ich nur, weil ich schon ein "paar" andere Sprachen kenne.

    Der Punkt in dem ich dir zustimme ist, dass ich vorher die Hilfe genauer hätte anschauen sollen. ^^
    On teh internet u pwn noobs - but in real life noobs own you.
  • Wenn ich mir diesen Artikel so durchlese bekomme ich schon den Eindruck, dass die map gerade aus Performancegründen sortiert wird.
    Eine Implementation ist mit Bäumen möglich, die weitaus häufigste Umsetzung ist jedoch die Hashtabelle.

    Denn dadurch erhöht sich die Zugriffsgeschwindigkeit enorm. Also zumindest technisch wird es sortiert, aber bei manchen Programmiersprachen wird die map nicht sortiert durchlaufen, z.B. bei PHP mit dem foreach Konstrukt, was aber nicht heißt, dass die map nicht sortiert ist. Also zumindest bei PHP und C++ hab ich gelesen, dass sie sortiert sind und das macht wegen oben genannten Performancegründen auch Sinn.
  • Foo schrieb:

    Und warum? Weil es ineffizent ist. Du musst nach jedem einfügen eines Schlüssels neu sortieren.


    Blödsinn. Bei einer Automatisch sortierten Liste ist doch bei jedem Einfügen die Liste bereits sortiert. D.h. du musst nicht die ganze Liste neu sortieren, sondern nur den Platz für das neue Element finden. Und da man auf einer sortierten Liste so schön binär suchen kann befindet sich die Laufzeit beim Einfügen in O(log n).
    Ok, das mag zwar ineffizienter sein, als die Laufzeit beim einfachen Anhängen (O(1)), aber wenn man danach was sucht, und i.A. kann man davon ausgehen, dass man in Datensätzen öfter nach Werten sucht als neue einzufügen, hat man wieder logarithmische Laufzeit, während es sich bei einer unsortierten Liste um lineare Laufzeit handelt.

    Die Effizienz, die man also beim Suchen durch diese Implementation gewinnt, macht die "Ineffizienz" (auch wenn dich einige schief anschaun werden, wenn du logarithmische Laufzeit als ineffizient bezeichnest) wieder mehr als wett.
  • Wikipedia:
    ... diese liegen in keiner festgelegten Reihenfolge vor.


    Mit neu sortieren meine ich folgendes:

    Normalerweise werden solche Datenstrukturen als Stack im Speicher angelegt. Wenn du in einem Stack, eine Einfügeoperation machst, musst alle nachfolgenden Schlüssel neu "numerieren" .

    Dh. Du hast eine Map mit 10 Elementen und fügst an Position n etwas ein musst du 10-n Elemente neu addressieren. Das einfügende Element nicht mitberechnet.
    On teh internet u pwn noobs - but in real life noobs own you.
  • Du sprichst hier von "echten Arrays", also solchen mit numerischen Indizes. Und solche werden wie du schon sagst im Speicher hintereinander angelegt. Aber wir reden hier über maps und diese werden wie bei Wikipedia beschrieben in Bäumen oder häufiger in Hashtabellen gespeichert.

    Das Zitat "... diese liegen in keiner festgelegten Reihenfolge vor." bezieht sich übrigens auf die Struktur in der Theorie und bedeutet, dass die Paare unabhängig voneinander vorliegen. Außerdem würde das Argument auch deine Theorie nicht unterstützen, denn du behauptest ja, die Paare würden nicht sortiert und in der Reihenfolge in der man sie eingefügt hat vorliegen. Und dies wäre ja dann eine "festgelegte Reihenfolge" wie im Zitat.
  • Also ich hab schon Maps in verschiedenen Programmiersprachen im Debugger gesehen. Und es war immer in der Reihenfolge, in der die Map gefüllt wurde.

    Im Beispiel der Hashtabelle (die Java5 implementierung) auf Wikipedia, ist dies auch erkennbar:

    GML-Quellcode

    1. // ein Element mit vorhandenem Schlüssel wird überschrieben (kein Doppeleintrag)
    2. public void eintragen(Schluessel schluessel, Element element) throws VollException {
    3. if (anzahl == tabelle.length)
    4. throw new VollException();
    5. // Nebeneffekt: vorhanden() hat index auf einen freien Platz positioniert
    6. else if (! vorhanden(schluessel)) {
    7. // neu eintragen, da ! vorhanden():
    8. tabelle[index].schluessel = schluessel;
    9. tabelle[index].belegt = true;
    10. anzahl++;
    11. }
    12. tabelle[index].element = element; // wenn vorhanden(), dann wird überschrieben
    13. }
    Alles anzeigen
    On teh internet u pwn noobs - but in real life noobs own you.
  • Und wann hörst du endlich auf, uns zu erzählen, was andere Sprachen so machen?
    Entweder, du beschäftigst dich endlich mit der Dokumentation des GM und hälst dich an die, oder du programmierst in den Sprachen von denen du so viel hälst...

    Und auch in Java habe ich bereits Implementationen von Maps als verkettete Listen gesehen, und dort muss man zum Einfügen eines neuen Datensatzes lediglich 2 oder 4 Verweise anpassen.
  • Wie schon weiter oben beschrieben, ist die Reihenfolge, in der die map durchlaufen wird nicht immer die sortierte. Aber technisch wird es eben sortiert gespeichert.
    Die Impementierung verwendet lineare Sondierung, eine Art des Hashings die nicht wie du denkst die Elemente nacheinander in das Array einträgt sondern der index wird in Abhängigkeit des Schlüssels berechnet. Das ist auch eine Form des Sortierens ;).
  • Sorry CAS,

    aber du brauchst nicht immer so aufbrausend zu sein - das finde ich deplatziert.
    Mein Problem war lediglich, dass sich GML bei Maps anders verhält, als ich es sonst von Programmiersprachen kenne.

    Und Bl@ckSp@rk du scheinst mich nicht verstehen zu wollen - finde das nicht i.O. Egal was ich zu dem Thema vorbringe, du weisst es besser - anstatt sich auf Beobachtungen und Erfahrung zu stützen.

    Meine Erfahrung ist, wie schon zig mal erwähnte eine andere. Diejenigen die schon Erfahrungen mit anderen Programmiersprachen gemacht haben, werden mir recht geben, dass die GML Implementierung unerwartet reagiert.
    On teh internet u pwn noobs - but in real life noobs own you.