Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Ideen gesucht: Hashing mit vektoren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
12.10.2006, 19:50 Uhr
~grimmel
Gast


Ich habe Probleme einen Begin zu starten...vielleicht hat jemand eine gute Idee...
Mein Problem hat sich nun so verändert:

Ich habe immer einen Vektor mit mehreren verschiedenen double werten z.B so:

v1 = [-2.5, 3.0, 0.0, -6.0, 7.3]

und immer einen zugehörigen 2ten vektor der ein einheitsvektor ist. z.B so:

e1 = [0.0, 0.0, 0.0, 1.0, 0.0]

Aus diesen 2 eingaben wird zusätzlich folgendes errechnet:
* aus v1 wird eine qr zerlegung gemacht also v1 wird verändert und hat neue werte
* ein weiterer vektor mit double werten (wie er errechnet wird ist egal) - sieht z.B so aus: t1 = [-3.889, 2.56, 0.0]
* ein 2ter weiterer vektor mit double werten z.B m1 = [-9.004, 8.0]

UNd folgendes wird am Ende gebraucht:
* ein vektor der nur aus 0en und 1en besteht: p1 = [1,0,0,1,0]

Nun zum Hashing:
Am Anfang würde ich gerne testen ob eine Berechnung bereits einmal stattgefunden hat. Wenn also v1 schon mal berechnet wurde UND e1 gleich ist also beide vektoren schonmal für eine berechnung verwendet wurden dann gib mir einfach nur das berechnete m1 und p1 zurück.
Falls aber NUR v1 verwendet wurde aber z.B e2 so aussieht: e2 = [1.0,0.0,0.0,0.0,0.0]
dann gibt mir bitte nur das neue v1 (die qr zerlegung) zurück und zusätzlich t1 und p1. Jetzt wird die berechnung gestartet um m1 zu berechnen.

Nochmal vielleicht in pseudocode:


Code:
if v1' == v1:
      if e1' == e1:
              return m1 && return p1
      else:
              return v1 && return t1 && return p1 -> und führe die berechnung weiter mit diesen werten fort um m1 zu berechnen
else:
      berechne erst das neue v1 und t1 und daraus das neue m1 UND speichere alle ergebnisse im hash




Jetzt kommt der Knackpunkt:
Das nachschauen ob etwas berechnet wurde will ich mit einem Hash realisieren.
Nur frage ich mich wie ich das eindeutig ohne kollisionen bewerkstelligen kann?
ich müsste also den schlüssel irgendwie aus den elementen von v1 und e1 bauen???
e1 könnte man einfach nur als reinen integer sehen an welcher stelle sich die "1" befindet!
Dann wüsste ich nicht wie ich mehrere vektoren im hash speichern sollte also der zugriff z.B nur auf t1 ...? also sowas mein ich: t1 = hash[key] und m1 = hash[key] wobei key gleich ist...also unter demselben schlüssel gäbe es ja eine reihe von vektoren die zu speichern wären...??? Evtl. in einer structure speichern und diese structure im hash speichern?

Zusätzlich bräuchte ich Hilfe welches hash ich nehmen sollte....ich glaube nicht dass eine einfach stl::map da ausreicht oder? Ist der zugriff da schnell? Wenn ich eine eigenen hash- funktion haben will was ich ja evtl. brauche um den schlüssel zu generieren sollte ich da nicht evtl. sowas wie hash_map verwenden?
Und wenn ich sogar eine eigene Implementierung eines hashes brauche - (was ich nicht hoffe) welche datenstruktur müsste ich dann hernehmen? ein Array? Evtl. 2-dimensional?


Für Hilfe bin ich sehr dankbar!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.10.2006, 20:17 Uhr
Blubber2063



Also du solltest dich mal mit Kollisionsauflösungsverfahren beschäftigen, da gäbs lineares Sondieren, das heisst du suchst den nächsten freien Platz, wichtig ist aber das du dabei jeden möglichen Platz erreichen kannst. Dann gäbs noch double Hashing, dort suchst du einen freien Platz mit Hilfe einer 2. Hashfunktion. Oder du benutzt seperate Chaining, d.h. du nimmst ein Feld von Container und jeder doppelte Schlüssel wird im selben Container abgelegt, hier empfiehlt sich effizienzhalber ein balancierter Binärbaum.

Achso die eigentliche Hashtable ist eigentlich immer ein Array, denn es geht ja um direkten Zugriff mit dem Schlüssel.

Dieser Post wurde am 12.10.2006 um 20:25 Uhr von Blubber2063 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.10.2006, 20:44 Uhr
~grimmel
Gast


Danke,
aber bevor ich mich an Kollisionsmechanismen ranmache sollte ich wohl erst wissen welches oder ob ich überhaupt ein hash verwenden sollte...oder versteh ich jetzt was falsch?

Würde für meinen Fall evlt. auch eine "normale" std::map<key, structure> reichen???
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.10.2006, 10:35 Uhr
Th



map arbeitet logarithmisch bei der Suche (find). Wenn dir dies ausreicht, dann solltest du aber besser die std::multimap benutzen. Dann speicherst du alle Vektoren mit gleichem Key ab und nur wenn es mehrere Vektoren mit gleichem Key gibt, müßtest du dann die einzelnen Vektoren vergleichen. Mittels std::multimap::equal_range erhälst du ein Iterator-Paar, welches auf den Anfang und das Ende (exklusive) der zugehörigen Vektoren zeigt.

Evtl. hat deine Standard-Lib aber auch "hash_map" implementiert...

P.S: Kollisionen wirst du immer berücksichtigen müssen, da du NIE einen kollisionsfreien Schlüssel erzeugen kannst (außer deine Wertmenge ist beschränkt bzw. dein Schlüssel unendlich groß)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.10.2006, 13:51 Uhr
~grimmel
Gast


Danke,
ich bräuchte schon konstante Laufzeit. Deshalb habe ich auch eine hash_map zum laufen gebracht.
Nur wie sollte ich einzelne Vektoren speichern unter einem schlüssel. Etwa durch eine structure? Ist es hier sinnvoll nur Pointer auf die vektoren machen oder nicht?

so?
C++:
struct myStruct
{
     std::vector<double> v1;
     int a;
     std::vector<double> v2;
};

hash_map<int, myStruct> h_map;



??

oder doch in der struct mittels pointern? Hab nur eben gelesen dass pointer in
containern net so vorteilhaft sind?
Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: