| |

Fortgeschrittene ProgrammierungHashtabelle - 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. |  |
 | 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 |
  |
|
Neu! sevCommand 4.0 
Professionelle Schaltflächen im modernen Design!
Mit nur wenigen Mausklicks statten auch Sie Ihre Anwendungen ab sofort mit grafischen Schaltflächen im modernen Look & Feel aus (WinXP, Office, Vista oder auch Windows 8), inkl. große Symbolbibliothek. Weitere InfosTipp des Monats Access-Tools Vol.1 
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|
|
|
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
|
|