Verständnisfrage zu Maps

Für allgemeine Fragen zur Programmierung mit PureBasic.
Cardian
Beiträge: 40
Registriert: 15.11.2004 01:24

Verständnisfrage zu Maps

Beitrag von Cardian »

Hallo Leute!

Weiß jemand, ob die Map, die ihr zugeführten Elemente, gleich sortiert ablegt?
Ich hatte mich vor ewigen Zeiten mal darüber gestritten :?
und das schale Gefühl gehabt, intern sind die Maps nur ein Array/List mit Keys.
Allerdings werde ich auch heute nicht vollständig schlau aus der Hilfe (Version 4.6).

Auszug aus der Hilfe - bei Map:
"Die Einfüge-Reihenfolge der Elemente wird beim Verwenden einer Map nicht gespeichert
(anders als bei einer LinkedList) und daher kann sie auch nicht sortiert werden. "
Ich finde der Text ist mehrdeutig. Ist mit 'Einfüge-Reihenfolge' die Einfüge-Reihenfolge
des Anwenderprogramms oder die Einfüge-Reihenfolge der Map gemeint?
Vermute allerdings man meint das Erstere.

Sollte es in dem Fall nicht besser heißen (mein Geschmiere in rot):
"Die Einfüge-Reihenfolge der Elemente wird beim Verwenden einer Map nicht gespeichert
(anders als bei einer LinkedList) und daher muß sie auch nicht sortiert werden,
weil sie bereits sortiert abgelegt wurde. "

Ein Text als Alternative (weiß selbst daß so eine Beschreibung manchmal schwierig sein kann):
Maps (auch bekannt als Hashtable oder Dictionary) sind entwickelt worden, um das Suchen
in großen Datenmengen möglichst schnell und effektiv zu ermöglichen. Dazu wird jeder Eintrag
mit einem Key ("Schlüssel") versehen. Anhand dieses Keys wird der Eintrag in die Map einsortiert.
Die Map ist insofern ständig sortiert und benötigt keine Sortierfunktionen.
Benötigt man ein Eintrag, sucht man ihn anhand des Keys. Dabei wird intern so schnell wie möglich
in der Map nach dem Eintrag gesucht (logarithmisch). Die Suchgeschwindigkeit ist höher als beim
linearen Durchsuchen einer Liste.
Gefundene Einträge lassen sich wieder löschen.
Maps kann man wie eine Liste durchlaufen (siehe NextMapElement()). Löscht man dabei einen Eintrag,
wird der vorherige Eintrag der aktuelle des Durchlaufs. Dadurch kommt man bei allen Einträgen vorbei,
auch wenn man zwischendurch Löscharbeiten durchführt.

Leider fehlt noch ein PrevMapElement(). Welches bei Rückwärtssuchen relevant wäre.
(Z.B.: die nächstvorigen Nachnamen vor "Sch".)
Dabei müsste beim Löschvorgang das nächste Element zum aktuellen Element werden.

Nicht als böse Kritik zu verstehen, aber vlt. läßt sich für unseren fleißigen Hilfeschreiber
mit der Kritik was anfangen (mein Geschmiere wieder in rot):
Maps (auch bekannt als Hashtable oder Dictionary; in Deutsch auch "Liste, Tabelle, Verzeichnis"
List, Array und Directory sind was anderes; korrekt wäre Karte, vlt. auch Wörterbuch genannt)
sind Strukturen für das Speichern von Daten, welche entsprechend Ihren Bedürfnissen dynamisch
zugewiesen werden Gelaber. Es handelt sich dabei um eine Sammlung von
Elementen (die Daten, die Sie speichern möchten) und jedes Element ist vollkommen unabhängig
von den anderen im Gegenteil es sollte im Sinne der Sortierung völlig abhängig sein (prev, next, parent, child).
Sie können soviele Elemente hinzufügen, wie Sie möchten (oder soviele, wie in den Speicher Ihres Computers passen)
das ist nix neues, und greifen mittels einem Key (Schüssel) wieder darauf zu. Diese Art der Datenspeicherung
ist sehr nützlich, wenn Sie schnellen Zugriff auf ein beliebiges Element benötigen Das ist der Kern der Map und darum wichtig!.
Die Einfüge-Reihenfolge der Elemente wird beim Verwenden einer Map nicht gespeichert
(anders als bei einer LinkedList) und daher kann sie auch nicht sortiert werden Die Formulierung
hört sich an, als wenn die Map eine schwerverwundete List ist, die nicht mal die Leistung einer List
erbringen kann und nun mit gebrochenem Bein und ohne Munition im Schützgraben hockt. :lol:
.

Allgemeiner Tip:
Je komplexer ein Vorgang ist, um so besser ist es ihn in seinem Ablauf zu erklären. Würde auch
dem Anspruch als Einsteiger-Programmiersprache entgegenkommen. Zudem gibt es auch immer
einen Grund warum etwas bestimmtes (wie in dem Fall eine Map) für einen ganz konkreten
Anwendungsfall benötigt wird. Wenn man den Anwendungsfall klarmacht, wird das zu
Erklärende oft sehr einfach.


Gebt mir aber in jedem Fall mal ein Feedback, ob in der Map eine normale Baumarchitektur sitzt,
die normal logaritmisch arbeitet. Dafür wäre ich dankbar.
:)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Verständnisfrage zu Maps

Beitrag von ts-soft »

Die Erklärung in der Hilfe ist schon korrekt, es gibt keine bestimmte Reihenfolge!
Siehe hierzu: Hashtabelle

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Cardian
Beiträge: 40
Registriert: 15.11.2004 01:24

Re: Verständnisfrage zu Maps

Beitrag von Cardian »

Hmm ... also Freds Map ist also ein Hash. Immer noch so verdreht wie eh und je in PB.
In dem Fall ist die Hilfe ein einziger Fehler und ich frage mich jetzt auch wie man
überhaupt in einem Hash zu einer Next...Element()-Funktion kommen kann.
Wenn er nicht grade hellsehende Algorithmen eingebaut hat, muß er ja intern einen
Next-Zeiger integriert haben. (Wäre dann ein Hash mit List-Funktionalität in eine
Richtung).
Korrekt wäre es dann, diese Map einfach mal Hash zu nennen!
Denn eine Map muß man vorwärts und rückwärts durchsuchen können!

Und damit ist diese sogenannte Map für bestimmte Map-Aufgaben ziemlich unbrauchbar.
Wie man auch aus den Vorteilen und vor allem Nachteilen (des Wiki-Links) ersehen kann.
Zb. die effizente weitere Suche in der Nähe eines vorher herausgesuchten Wertes.
(Steht nicht so im Wiki, aber es geht um die kleinsten und größten-Suche).

Außer Dynamic Tree http://forums.purebasic.com/german/viewtopic.php?t=3227
und Brandans AVL http://www.purebasic.fr/german/viewtopi ... hilit=tree
habe ich im Forum / Google nichts gefunden, wo ein Map-Baum mit klassischem Muster
http://de.wikipedia.org/wiki/Baum_%28Graphentheorie%29 umgesetzt wird.

Kennt ihr noch andere PB-Bäume? Vielleicht suche ich ja nur an der falchen Stelle
und mit dem falschen Schlüsselwort ...
Auch gegen HashMaps ist nicht einzuwenden, hauptsache man kann auch vorwärts
wie rückwärts suchen.

... denke denke ...
Man könnte natürlich auch die verunglückte PB-Map nehmen und einen eigenen
PrevMapElement() programmieren ... :lol:
Weiß eigentlich jemand, ob die PB-Map einen dynamischen oder statischen Index
erzeugt? Den Hash-Algorithmus kann man wohl auch nicht beeinflussen ... oder?

Nebenfrage:
Wie soll PushMapPosition() funktionieren?
Laut Hilfe:
"Merkt sich das aktuelle Element (sofern eines vorhanden) der Map, wodurch es
später mittels PopMapPosition() wieder hergestellt werden kann."
Bedeutet merken gleichzeitig entfernen? Damit es später wiederhergestellt werden
kann?
Oder:
Bedeutet wiederhergestellt nur die Entfernung vom Push/Pop-Stack?

Grüße,
Cardian

Sorry für die Links, aber ich hab nicht ganz durchgesehen, wie man die richtig
einbindet.
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Verständnisfrage zu Maps

Beitrag von CSHW89 »

Erstmal zu deiner Nebenfrage:
PushMapPosition() und PopMapPosition() meinen die Position des Zeigers beim Durchlaufen der Map mittels ResetMap/NextMapElement bzw. mit der ForEach-Schleife. Siehe dazu das Beispiel in PushMapPosition. Dort wird die Map doppelt durchlaufen. Jede Map hat aber nur einen Iterator. Somit würde die innere Schleife den Iterator der äußeren zerstören. Das kann man mit diesen beiden Funktionen verhindern.

Und zur Tree-Frage:
Hatte mal einen Rot-Schwarz-Baum geschrieben. Liegt irgendwo auf meiner Platte. Werd ihn mal raussuchen.

lg Kevin

PS: PBTree ist online:
http://www.purebasic.fr/german/viewtopi ... =8&t=25082
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Antworten