Hashtabelle kreiren

  • Hi.

    Also folgendes: Wir müssen einen Sortieralgorithmus machen (InsertionSort), den ma auch schon haben. Der soll folgendermaßen funktionieren: Wir bekommen über einen Generator Zahlen rein. Wir wissen aber vorher weder welche Zahlen das sind noch wieviele es sind. Somit müssen wir das Array erst berechnen, was wir auch schon haben.
    Die Zahlen kommen dann in eine Hashtabelle mittels hashfunktion h(k) = k mod M. Es muss eine dynamische Hashtabelle sein, das heißt, bei Bedarf muss sie größer werden. Die Zahlen in der Tabelle werden bei Kollision mit Separate Chaining (=Überlaufkette) behandelt und anschließend wird halt alles mittels InsertionSort sortiert.

    Jetzt meine frage: Wie mach ich diese Hashtabelle?

    Wer FU sagt, muss auch T sagen

  • Eine Hashtable wird nie größer, außer du wechselst mittendrin deine Hashfunktion (was sehr dumm wäre).
    Du brauchst einfach ein Array mit Größe M, und jeder Eintrag davon beinhaltet eine verkettete Liste (die hat schon eine dynamische Größe).

    zB

    Code
    template <class T> struct Entry {
      T value;
      Entry *next;
    };
    template <class T> Entry<T> *hashtable[M];

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Eine Hashtable wird nie größer, außer du wechselst mittendrin deine Hashfunktion (was sehr dumm wäre).


    Die Hashing-Funktion kann ruhig die selbe bleiben. Aber wenn ich in eine Hashtable mit 10 Elementen schon 10.000 Elemente eingefügt habe ohne zu vergrößern ist der Vorteil der schnelle Lokalisierung eines Elements weg, da für jede Position der ganze Bucket durchsucht werden soll.

    Schau mal z.B. auf http://en.wikipedia.org/wiki/Hash_table#Table_resizing.

  • des steht auf da homepage: des steht auf da HP: Unabhängig von der implementierten Datenstruktur muss der Container die Speicherung von beliebig vielen Werten unterstützen. Bei jenen Datenstrukturen, die prinzipiell mit fixen (Tabellen-)Größen arbeiten, ist daher vorzusehen, dass die Struktur bei Bedarf vergrößert wird. Wenn also etwa bei einem statischen Hashverfahren die Tabelle den maximalen Belegungsfaktor (zb 0,7) überschreitet, so ist eine größere Tabelle anzulegen und die Werte sind neu zu hashen.

    Wer FU sagt, muss auch T sagen

  • Wenn also etwa bei einem statischen Hashverfahren die Tabelle den maximalen Belegungsfaktor (zb 0,7) überschreitet, so ist eine größere Tabelle anzulegen und die Werte sind neu zu hashen.

    in dem fall musst du ein neues (größeres) M und damit eine neue hashfunktion (damit du die größere tabelle ausnutzen kannst) wählen sowie alle werte neu hashen. (siehe johnfoos link).

    edit: 5.000ster post - spam ftw ;)

  • Ok, da musst du dann einfach in deiner Hashfunktion dann den M-Parameter verändern, alle Elemente von der alten Liste auslesen und in die neue einfügen (dabei solltest du M logischerweise nicht nur um 1 erhöhen).

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!