Hallo
Ik probeer wat fundamentele zaken over datastructuren bij te leren.
Ik ben al enkele dagen bezig met de hashtable, lezen en proberen.
En soms voel ik me zo dom. Een voorbeeld: de hashtable implementatie werkt met primes, want die zijn (blijkbaar) performanter te combineren met een modulo bewerking... hmmm ik ben opgeleid als informaticus (as in: het informatiseren), en niet als wiskundige/computertechnicus. Maar interessant is het wel.
Goed. Mijn huidige aanpak.
Ik heb een NoobHashtable-class gemaakt, met daarin een array, een this[x] methode die intern een Add() en een Get() aanroept en dat is het zo wat voorlopig.
Ik heb gelezen dat je enkele technieken hebt om collisions op te lossen, waarvan ik enkel rehashing (=double hashing) verder wil uitdokteren daar deze mij het interessants lijkt en deze dus ook in de .Net BCL implementatie zit.
Mijn Add() methode, steekt een value op de gepaste index (=hash(key)) van mijn array. Bij een collision ga ik gewoon enkele keren proberen te "double hashen" totdat er een indexnummer tevoorschijnkomt die niet bezet is. Als dat ook niet lukt, ga ik mijn array expanden om vervolgens alle keys hun hashes te herberekenen, om daarna nog eens te proberen de Add() te vervolledigen.
Nu, dit is zowat de meest basis redenering denk ik. En het werkt wel een beetje.
Maar, ik begrijp eigenlijk geen snars van wat er nu PRECIES in de System.Collections.Hashtable gebeurt.
Ten eerste snap ik de wiskunde niet achter die standaard hash functie. Waarom nu net die? Waarom bit shiften met 5? Enzoverder... (Ik snap natuurlijk de modulo wél)
Ik snap hun seed en incr variabelen niet, evenmin hun ding met de InitHash().
Ik weet niet waarom ze in hun "Entry" een hash_coll bijhouden. Ik vermoed dat ze dit gebruiken voor performantie of bij het rehashen bij een expand van de array.
Verder ben ik ook niet helemaal zeker over de private vars count, occupancy (wat het verschil ?) en loadsize en loadfactor. Bedoelen ze niet "actualLoadFactor" en "optimalLoadfactor"?
Ook zitten de te goochelen met variabelen alla num1, num2, num3, index2, ....
Ik word er helemaal gek van. Het enige wat ik vond van enig nut: MSDN: Part 2: The Queue, Stack, and Hashtable
Maar zoals reeds gezegd, kan ik mijn brein niet om die hashfunctie krijgen.
Ik wil absoluut verder met dit verhaal, maar heb de neiging van hier en daar een missing link te hebben.
Hulp is nuttig in dit geval!
Ik wil hierna verder met binary tree, bst, b-tree, indexes, disk implementaties, vul het rijtje aan, ...
Het zal iig een harde leerschool worden, gezien mijn struggles met iets relatief eenvoudig als hasing : (
Voor wie mijn huidige test wil zien: https://github.com/Userna...Hashtables/MyHashtable.cs
Deze werkt wel niet meer momenteel, de hash functie klopt niet alsook het offset probeersel.
Ik probeer wat fundamentele zaken over datastructuren bij te leren.
Ik ben al enkele dagen bezig met de hashtable, lezen en proberen.
En soms voel ik me zo dom. Een voorbeeld: de hashtable implementatie werkt met primes, want die zijn (blijkbaar) performanter te combineren met een modulo bewerking... hmmm ik ben opgeleid als informaticus (as in: het informatiseren), en niet als wiskundige/computertechnicus. Maar interessant is het wel.
Goed. Mijn huidige aanpak.
Ik heb een NoobHashtable-class gemaakt, met daarin een array, een this[x] methode die intern een Add() en een Get() aanroept en dat is het zo wat voorlopig.
Ik heb gelezen dat je enkele technieken hebt om collisions op te lossen, waarvan ik enkel rehashing (=double hashing) verder wil uitdokteren daar deze mij het interessants lijkt en deze dus ook in de .Net BCL implementatie zit.
Mijn Add() methode, steekt een value op de gepaste index (=hash(key)) van mijn array. Bij een collision ga ik gewoon enkele keren proberen te "double hashen" totdat er een indexnummer tevoorschijnkomt die niet bezet is. Als dat ook niet lukt, ga ik mijn array expanden om vervolgens alle keys hun hashes te herberekenen, om daarna nog eens te proberen de Add() te vervolledigen.
Nu, dit is zowat de meest basis redenering denk ik. En het werkt wel een beetje.
Maar, ik begrijp eigenlijk geen snars van wat er nu PRECIES in de System.Collections.Hashtable gebeurt.
Ten eerste snap ik de wiskunde niet achter die standaard hash functie. Waarom nu net die? Waarom bit shiften met 5? Enzoverder... (Ik snap natuurlijk de modulo wél)
Ik snap hun seed en incr variabelen niet, evenmin hun ding met de InitHash().
Ik weet niet waarom ze in hun "Entry" een hash_coll bijhouden. Ik vermoed dat ze dit gebruiken voor performantie of bij het rehashen bij een expand van de array.
Verder ben ik ook niet helemaal zeker over de private vars count, occupancy (wat het verschil ?) en loadsize en loadfactor. Bedoelen ze niet "actualLoadFactor" en "optimalLoadfactor"?
Ook zitten de te goochelen met variabelen alla num1, num2, num3, index2, ....
Ik word er helemaal gek van. Het enige wat ik vond van enig nut: MSDN: Part 2: The Queue, Stack, and Hashtable
Maar zoals reeds gezegd, kan ik mijn brein niet om die hashfunctie krijgen.
Ik wil absoluut verder met dit verhaal, maar heb de neiging van hier en daar een missing link te hebben.
Hulp is nuttig in dit geval!
Ik wil hierna verder met binary tree, bst, b-tree, indexes, disk implementaties, vul het rijtje aan, ...
Het zal iig een harde leerschool worden, gezien mijn struggles met iets relatief eenvoudig als hasing : (
Voor wie mijn huidige test wil zien: https://github.com/Userna...Hashtables/MyHashtable.cs
Deze werkt wel niet meer momenteel, de hash functie klopt niet alsook het offset probeersel.