vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fortgeschrittene Programmierung
Hashtabelle - Kollisionen 
Autor: vbtricks
Datum: 24.06.05 16:14

Hallo zusammen,

hier auch mal eine Frage von mir. Das ist die Aufgabe:
In eine Hashtabelle mit 11 Einträgen (Indizes 0 bis 10) sollen die Zeichenfolgen
CLA
LEW
SCH
BUR
GRI
HAU
KOM
KRO
PIN
in der angegebenen Reihenfolge eingefügt werden. Für die verwendete Hashfunktion sind den Buchstaben A bis Z die Werte b(A)=1 bis b(Z)=26 zugeordnet; gewichten Sie den ersten Buchstaben mit 2 und den dritten Buchstaben mit Gewicht 1. Die Hashfunktion sei
also f(a1a2a3:: = (2 * b(a1) + b(a3) mod 11) (Beispiel: der Hashwert des Wortes
"TRIVIAL" ist damit (2 * 20 + 9 mod 11) = 5).

Perfektes Hashing: modifizieren Sie die Gewichte in der Hashfunktion so,
dass für die obigen 9 Elemente in einer Hashtabelle mit 11 Einträgen keine
Kollision stattfindet.

Das habe ich jetzt versucht, mit einem VB Programm zu ermitteln:
' Groesse der Hashtabelle
Private Const intTableSize As Integer = 11
' Eintraege, die in die Hashtabelle eingefuegt werden sollen
Dim MyItems As New Collection
 
' unsere Hashfunktion
' strText = Text, von dem der Hashwert zu ermitteln ist
' intFactor = Gewicht fuer den ersten Buchstaben
' intFactor2 = Gewicht fuer den dritten Buchstaben
Private Function CalcHash(ByVal strText As String, ByVal intFactor As Integer, _
    ByVal intFactor2 As Integer) As Integer
 
Dim intAsc1 As Integer, intAsc3 As Integer
intAsc1 = (Asc(Mid(strText, 1, 1)) - 64) * intFactor
intAsc3 = (Asc(Mid(strText, 3, 1)) - 64) * intFactor2
CalcHash = (intAsc1 + intAsc3) Mod intTableSize
End Function
 
Private Sub Command1_Click()
' "Hashtabelle" mit "Besetzt"-Markern
Dim bolOccupied(0 To intTableSize - 1) As Boolean
Dim intCurItem As Integer
Dim intFactor As Integer, intFactor2 As Integer, i As Integer
Dim intIndex As Integer
Dim bolCorrect As Boolean
For intFactor = 1 To 100
    For intFactor2 = 1 To 100
        ' "Besetzt"-Array zuruecksetzen
        For i = 0 To intTableSize - 1
            bolOccupied(i) = False
        Next
        ' Kollisionsfreiheit annehmen
        bolCorrect = True
        For intCurItem = 1 To MyItems.Count
            ' Hashwert ermitteln
            intIndex = CalcHash(MyItems(intCurItem), intFactor, intFactor2)
            ' auf Kollision pruefen
            If bolOccupied(intIndex) = False Then
                bolOccupied(intIndex) = True
            Else
                bolCorrect = False
                Exit For
            End If
        Next
        If bolCorrect Then
            ' keine Kollisionen
            MsgBox "Ermittelt: " & intFactor & ", " & intFactor2
            Exit Sub
        End If
    Next
Next
MsgBox "Nichts gefunden"
End Sub
 
Private Sub Form_Load()
MyItems.Add "CLA"
MyItems.Add "LEW"
MyItems.Add "SCH"
MyItems.Add "BUR"
MyItems.Add "GRI"
MyItems.Add "HAU"
MyItems.Add "KOM"
MyItems.Add "KRO"
MyItems.Add "PIN"
End Sub
Aber das Programm gibt mir immer zurück, dass es keine Kombination finden würde. Auch genauer Prüfung konnte ich keinen Fehler finden. Jetzt besteht natürlich die Möglichkeit, dass das eine Fangfrage ist, oder das da doch irgendwo ein Fehler ist.

Kann mir jemand weiterhelfen?

Danke im Voraus,

Stefan

Web: http://www.vbtricks.de.vu/

VBTricks.de.vu. Meine Webseite zu VB und anderen Programmiersprachen. Verschiedene fortgeschrittene OCXe und komplette Projekte sind im Sourcecode verf?gbar.

alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Hashtabelle - Kollisionen675vbtricks24.06.05 16:14
Re: Hashtabelle - Kollisionen369vbtricks25.06.05 06:54

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel