Datastructuren en algoritmen
Wat is de meest passende reden dat open adressering met lineair proberen bij een hashtabel met veel elementen en een bezettingsgraad van ongeveer 0,5 vaak sneller is dan chaining (elementen koppelen met gelinkte lijsten)?
- ANa een botsing is de volgende onderzochte positie het naburige element, dat vaak in dezelfde cacheregel of de volgende ligt, zodat er minder geheugentoegangen nodig zijn
- BBij open adressering treden helemaal geen botsingen op
- CBij chaining moet de hashfunctie twee of meer keer worden berekend
Antwoord en toelichting tonen
Antwoord: A. Na een botsing is de volgende onderzochte positie het naburige element, dat vaak in dezelfde cacheregel of de volgende ligt, zodat er minder geheugentoegangen nodig zijn
Op moderne CPU's duurt het lezen van het hoofdgeheugen na een cachemiss veel langer dan berekeningen zoals vergelijkingen. Lineair proberen onderzoekt na een botsing de naburige positie, dus de meeste pogingen blijven binnen dezelfde cacheregel, en ook prefetching helpt. Bij chaining ligt het volgende element van een lijst vaak elders in het geheugen, zodat elke gevolgde pointer waarschijnlijk een cachemiss veroorzaakt. Ook bij dezelfde complexiteit in O-notatie kan de werkelijke snelheid sterk verschillen, afhankelijk van hoe het geheugen wordt benaderd. Lineair proberen wordt echter bij een hoge bezettingsgraad sterk trager doordat bezette posities clusteren, dus de bezettingsgraad wordt vrij laag gehouden.