Anregungen: Verwalten einer "Dynamischen Menge"
- Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Anregungen: Verwalten einer "Dynamischen Menge"
Tag zusammen
Ich bin auf der Suche nach Anregungen, wie ich ein Problem möglichst optimal lösen kann.
Und zwar möchte ich eine Menge an Objekten (der gleichen Klasse) verwalten. Die Größe der Menge ändert sich zur Laufzeit mitunter aber drastisch.
Ich bin aber nur in der Lage, 4KB große Blöcke anzufordern oder freizugeben. (Ja ja ..)
Jedes einzelne Element möchte ich möglichst schnell erreichen können, über eine eindeutige Identifikationsnummer z.B.
Allerdings soll sich der Speicherbedarf auch am Minimum bewegen, sprich, ich will nicht zu viel ungenutzten Speicher haben.
Meine ersten Überlegungen gingen hin zu einer "Liste" aus diesen 4KB Blöcken, in jedem eine gewisse (aber fest bekannte) maximale Menge an Objekten sowie eine kleine Tabelle mit den enthaltenen Identifikationsnummern (oder auch nur Start & Ende)
Wenn einer dieser Blöcke beim Löschen nun zu leer wird (und ein benachbarter Block ebenfalls leerer wird), dann könnte man diese Blöcke ja leicht zusammenlegen zu einem Block, und so den Speicherplatzbedarf der gesamten Struktur wieder minimieren.
Ideen oder Kritik zu meinem Konzept, bzw zu meiner Problemstellung?
Ist das Problem, bzw das, was ich erreichen will, verständlich?
Unter Umständen kann ich das auch noch als Skizze verdeutlichen, nur sitz ich grad im Zug (ein Regional Express) und da ist es mit GIMP immer etwas schwierig ^^
LG
Daniel
Ich bin auf der Suche nach Anregungen, wie ich ein Problem möglichst optimal lösen kann.
Und zwar möchte ich eine Menge an Objekten (der gleichen Klasse) verwalten. Die Größe der Menge ändert sich zur Laufzeit mitunter aber drastisch.
Ich bin aber nur in der Lage, 4KB große Blöcke anzufordern oder freizugeben. (Ja ja ..)
Jedes einzelne Element möchte ich möglichst schnell erreichen können, über eine eindeutige Identifikationsnummer z.B.
Allerdings soll sich der Speicherbedarf auch am Minimum bewegen, sprich, ich will nicht zu viel ungenutzten Speicher haben.
Meine ersten Überlegungen gingen hin zu einer "Liste" aus diesen 4KB Blöcken, in jedem eine gewisse (aber fest bekannte) maximale Menge an Objekten sowie eine kleine Tabelle mit den enthaltenen Identifikationsnummern (oder auch nur Start & Ende)
Wenn einer dieser Blöcke beim Löschen nun zu leer wird (und ein benachbarter Block ebenfalls leerer wird), dann könnte man diese Blöcke ja leicht zusammenlegen zu einem Block, und so den Speicherplatzbedarf der gesamten Struktur wieder minimieren.
Ideen oder Kritik zu meinem Konzept, bzw zu meiner Problemstellung?
Ist das Problem, bzw das, was ich erreichen will, verständlich?
Unter Umständen kann ich das auch noch als Skizze verdeutlichen, nur sitz ich grad im Zug (ein Regional Express) und da ist es mit GIMP immer etwas schwierig ^^
LG
Daniel
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne!
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.
Ich helfe gerne!
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Anregungen: Verwalten einer "Dynamischen Menge"
Wie wäre es mit einer Hashtable?
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
Re: Anregungen: Verwalten einer "Dynamischen Menge"
Wie meinst du das genau? Reicht es hier aus einen Index in einem Array bzw. einen Zeiger auf die Speicherposition zu haben?Dirty Oerti hat geschrieben: Jedes einzelne Element möchte ich möglichst schnell erreichen können, über eine eindeutige Identifikationsnummer z.B.
Eine Möglichkeit die ich schon öfters gesehen habe, ist es sich den letzten freigewordenen Speicherblock zu merken und wenn ein neuer Speicherblock freigegeben wird die Adresse/Index etc. auf den alten letzten freien Speicherblock in den neuen speichern, um so immer in O(1) einen freien Block zu erhalten. Beim Vergeben nimmt man einfach den zuletzt gemerkten freien Block und merkt sich als neuen freien Block, den auf den in dem neu verwendeten verwiesen worden ist. So ersparst du dir auch eine zusätzliche Struktur zur Verwaltung der Blöcke. (In freie Blöcke kannst du ja schreiben was du willst...)
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)
OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at
OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at
- Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Re: Anregungen: Verwalten einer "Dynamischen Menge"
Ein "Index" ist ausreichend, ein Zeiger - da bin ich realistisch - ist bei sowas kaum zu verwirklichen, da bei einer "Kontraktion" ziemlich viele Zeiger umgesetzt werden müssten.Kerli hat geschrieben:Wie meinst du das genau? Reicht es hier aus einen Index in einem Array bzw. einen Zeiger auf die Speicherposition zu haben?
Der Index muss dabei aber auch nicht fortlaufend sein.
Zwar sortiert, aber es kann z.B. die 5 auch fehlen, obwohl die 3 und die 6 belegt sind. Die 5 wird in diesem Fall im Übrigen auch nicht mehr auftauchen. Eine wirklich absolut EINDEUTIGE Identifikation sozusagen.
Das ich nicht auf ein nicht belegtes Objekt zugreife (die 5) ist kein Problem. Das ist geregelt.
Das finde ich sehr gut.Kerli hat geschrieben:Eine Möglichkeit die ich schon öfters gesehen habe, ist es sich den letzten freigewordenen Speicherblock zu merken und wenn ein neuer Speicherblock freigegeben wird die Adresse/Index etc. auf den alten letzten freien Speicherblock in den neuen speichern, um so immer in O(1) einen freien Block zu erhalten. Beim Vergeben nimmt man einfach den zuletzt gemerkten freien Block und merkt sich als neuen freien Block, den auf den in dem neu verwendeten verwiesen worden ist. So ersparst du dir auch eine zusätzliche Struktur zur Verwaltung der Blöcke. (In freie Blöcke kannst du ja schreiben was du willst...)
Danke schonmal
Mal sehen, in wie weit ich das in mein bestehendes Konzept einpflegen kann.
Wie meinst du das?cloidnerux hat geschrieben:Wie wäre es mit einer Hashtable?
Bzw, unter welchem Hintergedanken kommst du auf eine Hashtable?
Eine Hashtable mit Verkettung kann ich ja ausschließen, verkettete Listen aus Objekten gibts nicht.
Ich bräuchte also eine Sondiermethode, um Kollisionen aufzulösen.
Jedoch verschiebe ich das Problem damit nur. Denn: Wie groß mach ich denn meine Hashtable?
Suchen ist für mich ja auch nicht so wichtig.
Wichtig ist, dass ich möglichst wenig Platz verschwende, gleichzeitig aber beliebige viele (zwischen 2 und 20000 o.ä.) Elemente speichern kann. Dabei muss ich möglichst einfach auf die Elemente zugreifen können, weshalb ich eben auf dieses "Quasiarray" gekommen bin.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne!
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.
Ich helfe gerne!
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.
Re: Anregungen: Verwalten einer "Dynamischen Menge"
Was ist überhaupt die Problemstellung?
- Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Re: Anregungen: Verwalten einer "Dynamischen Menge"
Ich hab eine Menge von Objekten (Sprich Speicherblöcke einer vorgegebenen, festen Größe), die ich verwalten will.
Diese Menge will ich so verwalten, dass ich möglichst wenig Speicherplatz zur Verwaltung verbrate, gleichzeitig ist Geschwindigkeit aber auch verdammt wichtig (eigentlich sogar wichtiger).
Die Anzahl der Objekte variiert stark, sprich von 10 bis hin zu 1000-den.
Zu Grunde liegt mir eine Speicherverwaltung, die 4KB große Blöcke anfordern, oder auch freigeben kann.
Ziel ist es jetzt, dass bei 10 Objekten möglichst z.B. nur 1 Block verwendet werden muss (die Objekte sind selbst immer nur einige Bytes groß), bei vielen dann aber natürlich mehr (aber nur proportional).
Gleichzeitig muss ich 1 bestimmtes Objekt in der Menge (sehr sehr) schnell finden können.
Diese Menge will ich so verwalten, dass ich möglichst wenig Speicherplatz zur Verwaltung verbrate, gleichzeitig ist Geschwindigkeit aber auch verdammt wichtig (eigentlich sogar wichtiger).
Die Anzahl der Objekte variiert stark, sprich von 10 bis hin zu 1000-den.
Zu Grunde liegt mir eine Speicherverwaltung, die 4KB große Blöcke anfordern, oder auch freigeben kann.
Ziel ist es jetzt, dass bei 10 Objekten möglichst z.B. nur 1 Block verwendet werden muss (die Objekte sind selbst immer nur einige Bytes groß), bei vielen dann aber natürlich mehr (aber nur proportional).
Gleichzeitig muss ich 1 bestimmtes Objekt in der Menge (sehr sehr) schnell finden können.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne!
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.
Ich helfe gerne!
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.
Re: Anregungen: Verwalten einer "Dynamischen Menge"
Aber was ist die eigentliche Aufgabe? Ich würde gern den Kontext besser verstehen.
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Anregungen: Verwalten einer "Dynamischen Menge"
Die Aufgabe scheint es doch zu sein, eine Dynamische Verwaltung für eine Unbestimmte Menge an Objekten zu programmieren. Diese Verwaltung muss schnell und Sparsam sein.
Du hast nur die Möglichkeit 4kb Blöcke anzufragen, sodass einfach für jedes Objekt einen neuen Block anzufragen nicht Funktioniert.
Und das ist egt alles, was ich finde wichtig ist für dieses Problem das es zu Lösen gilt.
Du hast nur die Möglichkeit 4kb Blöcke anzufragen, sodass einfach für jedes Objekt einen neuen Block anzufragen nicht Funktioniert.
Und das ist egt alles, was ich finde wichtig ist für dieses Problem das es zu Lösen gilt.
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
- fat-lobyte
- Beiträge: 1398
- Registriert: Sa Jul 05, 2008 12:23 pm
- Wohnort: ::1
- Kontaktdaten:
Re: Anregungen: Verwalten einer "Dynamischen Menge"
Ich nehme an die Menge sollte nicht "geordnet" sein, also es muss keinen Anfang und kein Ende geben?
Wie siehts denn mit dem Zugriff aus? Fügst du oft objekte ein oder löscht sie? Oder ist das eher etwas das wächst und wächst?
Muss eher das einfügen schnell funktionieren oder der Zugriff?
Wie siehts denn mit dem Zugriff aus? Fügst du oft objekte ein oder löscht sie? Oder ist das eher etwas das wächst und wächst?
Muss eher das einfügen schnell funktionieren oder der Zugriff?
Haters gonna hate, potatoes gonna potate.
- Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Re: Anregungen: Verwalten einer "Dynamischen Menge"
Nein, die Menge ist nicht geordnet, ich brauche nur eine Möglichkeit, jedes einzelne Objekt zu adressieren, z.B. über eine Nummer (die nicht zwingend eindeutig sein muss, aber für die Lebensdauer des Objektes sich nicht ändern darf)
Einfügen und Löschen muss funktionieren, sprich es muss auch so gelöscht werden, dass möglichst nicht eine Situation entsteht, in der z.B. 1000 Objekte nur noch vorhanden sind, die aber auf 1000 4KB Frames verteilt sind. Das wäre sozusagen der Worst-Case
Es wird oft eingefügt und gelöscht, aber nicht annähernd so oft, wie auf die Liste zugegriffen.
Sprich wichtigstes Geschwindigkeitskriterium ist der Zugriff.
Wichtig ist dabei eine Möglichkeit, über die Menge iterieren zu können.
Einfügen und Löschen muss funktionieren, sprich es muss auch so gelöscht werden, dass möglichst nicht eine Situation entsteht, in der z.B. 1000 Objekte nur noch vorhanden sind, die aber auf 1000 4KB Frames verteilt sind. Das wäre sozusagen der Worst-Case
Es wird oft eingefügt und gelöscht, aber nicht annähernd so oft, wie auf die Liste zugegriffen.
Sprich wichtigstes Geschwindigkeitskriterium ist der Zugriff.
Wichtig ist dabei eine Möglichkeit, über die Menge iterieren zu können.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne!
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.
Ich helfe gerne!
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.