Oplossing Uitleg
Runtime Complexiteit
get (hashset): O(1) in het gemiddelde geval, O(n) in het slechtste geval
set (hashset): Constante, O(1)
deletion at head when adding a new element (linked list): Constante, O(1)
zoekopdracht voor verwijderen en toevoegen aan staart (gekoppelde lijst): O(n)
complexiteit: O(n)
Geheugencomplexiteit
Lineair, O(n) waarbij n de grootte van de cache is.
Oplossing Breakdown
Caching is een techniek om gegevens op te slaan in een snellere opslagplaats (meestal RAM) om toekomstige verzoeken sneller te kunnen bedienen. Hieronder staan enkele veelvoorkomende voorbeelden waarbij cache wordt gebruikt:
- Een processor cache wordt gebruikt om gegevens sneller uit het hoofdgeheugen (RAM) te lezen.
- Cache in RAM kan worden gebruikt om een deel van schijfgegevens in RAM op te slaan en toekomstige verzoeken sneller af te handelen.
- Netwerkreacties kunnen in de cache in RAM worden opgeslagen om te veel netwerkoproepen te voorkomen.
Het cachegeheugen is echter meestal niet groot genoeg om de volledige dataset op te slaan. Dus moeten we de gegevens uit de cache verwijderen wanneer deze vol raakt. Er zijn een aantal caching-algoritmen om een ontruimingsbeleid voor de cache te implementeren. LRU is zeer eenvoudig en een veelgebruikt algoritme. Het kernconcept van het LRU-algoritme is om de oudste gegevens uit de cache te verwijderen, zodat er meer gegevens kunnen worden opgeslagen.
Om een LRU-cache te implementeren, gebruiken we twee gegevensstructuren: een hashmap en een dubbel gelinkte lijst. Een dubbel gelinkte lijst helpt bij het handhaven van de volgorde van uitzetting en een hashmap helpt bij het O(1) opzoeken van sleutels in de cache. Hier volgt het algoritme voor LRU-cache.
If the element exists in hashmapmove the accessed element to the tail of the linked listOtherwise,if eviction is needed i.e. cache is already fullRemove the head element from doubly linked list and delete its hashmap entryAdd the new element at the tail of linked list and in hashmapGet from Cache and Return
Merk op dat de dubbele gelinkte lijst wordt gebruikt om de meest recent benaderde elementen bij te houden. Het element aan de staart van de dubbel gelinkte lijst is het meest recent benaderde element. Alle nieuw ingevoegde elementen (in put) gaan naar de staart van de lijst. Op dezelfde manier gaat elk element waartoe toegang is verkregen (in een get operatie) naar de staart van de lijst.