PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Welche Umsetzung bietet die höchste Effiziens?



Cornix
28.10.2010, 18:05
Guten Abend,
einmal mehr eine kleine Frage meinerseits zum Effiziensvergleich zweier Methoden welche das gleiche bewirken sollen.

Edit:
Es hat sich bereits von selbst erledigt, ich werde wohl doch den Hash nehmen da er leichtere Möglichkeiten für das Erstellen von Events bietet da damit auch Texte als ID genommen werden können.

Nachdem ich mir angeschaut habe wie die self-switches des RPG-Maker XP umgesetzt worden sind habe ich mich entschieden ein derartiges, oder ähnliches, System auch für mein Projekt zu nutzen da ich hierin eine immense Vereinfachung sehe.

Allerdings will ich, bevor ich damit anfange es umzusetzen, die Meinung der Experten einholen über welche Variante es effektiver zu lösen wäre:

Für beide Methoden gilt:
Sowohl die Karte als auch jedes Event wird mit einem Index versehen.

Die erste Methode ist diejenige wie der RPG-Maker sie verwendet, über einen Hash.
der Key: [Map.ID, Event.ID] verweist auf die im Hash gespeicherten Variablen.

Die zweite Methode welche ich sehe ist durch ein zweidimensionales Array, beziehungsweise mehrere Arrays ineinander:
Array[Map.ID][Event.ID] oder Array[Map.ID, Event.ID] würde dann verwendet werden.

Wo liegen die Vorteile hierbei von einem Hash gegenüber der Umsetzung per Array?

Vielen Dank für die Antworten.

-KD-
29.10.2010, 00:47
Ob du Hash oder Array nimmst hängt vor allem von deinem Schlüssel ab. Bei Events verwendet der Maker deshalb keine Arrays, weil es nicht für jede Event-ID ein Event geben muss (du kannst ja auf der Map ein paar Events mit niedrigen IDs löschen). Entsprechend hättest du dann Lücken im Array, was vor allem dann unangenehm wird, wenn du über alle Events iterieren willst. Wenn du als ID einen Text nehmen willst, bietet sich sowieso nur ein Hash an.

Nichtsdestotrotz würde ich noch einen zweiten Vorschlag anbringen: Was wäre mit Hash[MapId][EventId], also einen doppelten Hash. Oder einen Array aus Hashs? Ich finde die Sache mit den doppelten Keys nicht so prickelnd. Vor allem aber lässt sich über die Map-ID sehr effizient abbilden, weswegen es schade wäre das mit einer nicht so hübschen Event-ID zu vermischen.

Cornix
29.10.2010, 20:27
Danke für die Anteilnahme, allerdings habe ich mich bereits entschieden einen Hash zu nehmen. Dieser bietet mir mehr Möglichkeiten den Events individuelle ID's in String Form zu geben.

Für den Key benutze ich derzeit folgendes:
Hash[ [Map.ID, Event.ID] ]
Die Map ID ist ein Integer die Event ID ein String.

-KD-
31.10.2010, 22:23
Ich sage ja nicht, dass du einen Array verwenden solltest, sondern dass du auch einen Hash aus Hashs nehmen könntest. Dann kannst du weiterhin die Event-ID als String übergeben, hast aber unter Umständen eine geringfügig bessere Performance, sowie die Möglichkeit, über alle Events einer Map zu iterieren.

Cornix
01.11.2010, 17:30
Aber würde denn ein Array mit einer Menge von Hashs nicht eine viel größere Menge von Speicher verbrauchen?

-KD-
01.11.2010, 21:23
Vielleicht, vielleicht auch nicht. Hashs sind immer ein gutes Stück größer als die Anzahl ihrer Elemente. Aber der Speicher spielt hier, denke ich, ohnehin keine so große Rolle (was sind schon ein paar megabyte mehr oder weniger). Und selbst wenn, so bist du mit einem Array aus Hashs besser dran. Denn du kannst einfach Maps, von denen du weißt, dass du sie nicht mehr besuchen wirst, einfach aus dem Array rauslöschen.
Das schöne an der Map-ID ist halt, dass die Events dadurch relativ gleichmäßig auf die einzelnen Hashs verteilt werden. Aber letztlich macht das auch keinen allzu großen Unterschied. Ich finde halt nur, dass du mit einem Array aus Hashs oder einem Hash aus Hashs flexibler bist, weil du gezielt alle Events einer Map auslesen kannst.

Cornix
01.11.2010, 21:28
Da hast du recht, alle Events innerhalb einer Map kann ich lediglich mit dem Hash nicht beeinflussen (Es wird lediglich eine Integer Variable über diesen Hash jedem Event zugeordnet, sozusagen eine Self-Variable)
Allerdings glaube ich derzeit noch nicht, dass ich dies nötig haben werde. Falls es doch jemals der Fall werden sollte werde ich es wohl umschreiben müssen, mir fällt derzeit nur keine Situation ein in welcher ich eine derartige Möglichkeit brauchen werde.