1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Hashtabelle kreiren

  • Ivy
  • 26. Mai 2007 um 18:01
  • Unerledigt
  • Ivy
    22
    Ivy
    Mitglied
    Reaktionen
    35
    Punkte
    4.920
    Beiträge
    889
    • 26. Mai 2007 um 18:01
    • #1

    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

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 26. Mai 2007 um 18:06
    • #2

    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!

  • JohnFoo
    20
    JohnFoo
    Mitglied
    Reaktionen
    61
    Punkte
    4.231
    Beiträge
    761
    • 26. Mai 2007 um 18:16
    • #3
    Zitat von hal

    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.

  • Ivy
    22
    Ivy
    Mitglied
    Reaktionen
    35
    Punkte
    4.920
    Beiträge
    889
    • 26. Mai 2007 um 18:18
    • #4

    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

  • mdk
    26
    mdk
    Emeritus
    Reaktionen
    130
    Punkte
    7.120
    Beiträge
    1.390
    • 26. Mai 2007 um 18:20
    • #5
    Zitat von Ivy

    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 :winking_face:

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 26. Mai 2007 um 18:23
    • #6

    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).

    Code
    template <class T> struct hashtable {
      unsigned M;
      Entry<T> **table;
    };
    
    
    template <class T> hashtable<T> *createTable(int M) {
      hashtable<T> *table = new hashtable<T>;
      table->M = M;
      table->table = new Entry<T>*[M];
      return table;
    }
    Alles anzeigen

    [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!

  • Maximilian Rupp 27. Dezember 2024 um 12:05

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung